为什么 ThreadPool 只及时启动一个线程
本文关键字:一个 线程 启动 ThreadPool 为什么 | 更新日期: 2024-10-31 13:59:21
我像书上说的那样启动线程:
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服务器抓取多个文件。