为什么 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 核处理器。

为什么 ThreadPool 只及时启动一个线程

你的ThreadMethod跑得太快了。你的代码一切都是正确的,除非可能的话,你应该从ThreadPool切换到新的抽象,如Task.Run

实际上,当我使 ThreadMethod 做更长的事情时,另一个线程在一段时间后启动,但它不是一次工作,而只是从一个线程切换到另一个线程。看起来我必须使用另一个工具。

TreadPool 具有可以使用的最大线程数。请参阅 ThreadPool.GetMaxThread 和 SetMaxThread。默认情况下,它可能等于可用内核的数量。

对于 CPU 密集型工作,这是有道理的,因为使用比内核更多的线程实际上会降低性能。但是,对于 I/O 密集型作业等慢速作业,许多线程可以并行运行以避免阻塞并等待 I/O 完成。示例:一次从各种FTP服务器抓取多个文件。