为什么Thread.Sleep会影响新任务的创建?
private static void Main(string[] args) { for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine("hej"); Thread.Sleep(10000); }); } Console.ReadLine(); }
为什么这段代码在一秒钟后不能打印1000次“hej”? 为什么Thread.Sleep(10000)会对代码行为产生影响?
Factory.StartNew
有效地将工作委托给ThreadPool
。
只要线程数小于或等于处理器数,Threadpool就会立即创建多个线程来响应请求。 一旦达到处理器计数,线程池将立即停止创建新线程。 这是有道理的,因为创建多于处理器计数的线程数会引入线程调度开销并且不返回任何内容。
相反,它会限制线程的创建。 它等待500毫秒,以查看是否有任何工作仍未处理,并且没有线程来处理请求。 如果有待处理的工作,它将引入一个新线程(只有一个)。 只要你有足够的工作要做,这个过程就会继续。
当工作队列的流量被清除时,线程池将破坏线程。 上面提到的过程一直在继续。
此外,线程池可以同时运行的线程数有一个最大限制 。 如果你点击它,线程池将停止创建更multithreading并等待以前的工作项完成,这样它就可以重用现有的线程。
这不是故事的结局,它是错综复杂的! 这些是ThreadPool做出的一些决定。
我希望现在很清楚为什么你看到你所看到的。
有许多因素会改变结果。
有些是(但不限于):
- 循环迭代的固有时间
- 线程池的大小
- 线程管理开销
编码行为的方式是预期的行为。 你等待1000毫秒来打印hej,打印完成后你再做Thread.sleep 10000毫秒。 如果要在一秒钟后打印1000次hej,请删除Thread.sleep(10000)
。