为什么 ThreadPool 一次只启动一个线程?
Why ThreadPool start only one thread in time?
我完全按照书中所说的方式开始线程:
for (int i = 1; i <= 4; i++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i);
}
ThreadMethod 看起来像:
static void ThreadMethod(object input) {
Console.WriteLine(input + " thread started");
//do some stuff for, like, 400 milliseconds
Console.WriteLine(input + " thread completed");
}
由于某种原因,2 个线程仅在 1 个线程完成后才启动(此时所有工作都已完成,2-4 个线程只是启动并停止什么都不做)。
有什么问题吗?问任何可以帮助解决这个问题的东西。
我不使用任何同步 类.
如果有关系,我有 2 个核心处理器。
你的 ThreadMethod
跑得太快了。您的代码一切正常,除非您应该从 ThreadPool
切换到新的抽象,例如 Task.Run
.
实际上,当我让 ThreadMethod 做更长的事情时,另一个线程在一段时间后启动,但它没有一次工作,只是从一个线程切换到另一个线程。看来我必须使用其他工具了。
TreadPool 有它可以使用的最大线程数。请参阅 ThreadPool.GetMaxThread 和 SetMaxThread。默认情况下它可能等于可用核心数。
对于 CPU 密集型工作,这是有道理的,因为使用比内核更多的线程实际上会降低性能。但是,对于 I/O 密集型作业等慢速作业,许多线程可以并行 运行 以避免阻塞并等待 I/O 完成。示例:一次从多个 FTP 服务器抓取多个文件。
我完全按照书中所说的方式开始线程:
for (int i = 1; i <= 4; i++) {
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), i);
}
ThreadMethod 看起来像:
static void ThreadMethod(object input) {
Console.WriteLine(input + " thread started");
//do some stuff for, like, 400 milliseconds
Console.WriteLine(input + " thread completed");
}
由于某种原因,2 个线程仅在 1 个线程完成后才启动(此时所有工作都已完成,2-4 个线程只是启动并停止什么都不做)。
有什么问题吗?问任何可以帮助解决这个问题的东西。 我不使用任何同步 类.
如果有关系,我有 2 个核心处理器。
你的 ThreadMethod
跑得太快了。您的代码一切正常,除非您应该从 ThreadPool
切换到新的抽象,例如 Task.Run
.
实际上,当我让 ThreadMethod 做更长的事情时,另一个线程在一段时间后启动,但它没有一次工作,只是从一个线程切换到另一个线程。看来我必须使用其他工具了。
TreadPool 有它可以使用的最大线程数。请参阅 ThreadPool.GetMaxThread 和 SetMaxThread。默认情况下它可能等于可用核心数。
对于 CPU 密集型工作,这是有道理的,因为使用比内核更多的线程实际上会降低性能。但是,对于 I/O 密集型作业等慢速作业,许多线程可以并行 运行 以避免阻塞并等待 I/O 完成。示例:一次从多个 FTP 服务器抓取多个文件。