[英]Using ThreadPool.QueueUserWorkItem - thread unexpectedly exits
[英]ThreadPool.QueueUserWorkItem Vs new Thread
我有以下代碼:
static void Main(string[] args)
{
Console.Write("Press ENTER to start...");
Console.ReadLine();
Console.WriteLine("Scheduling work...");
for (int i = 0; i < 1000; i++)
{
//ThreadPool.QueueUserWorkItem(_ =>
new Thread(_ =>
{
Thread.Sleep(1000);
}).Start();
}
Console.ReadLine();
}
根據Bart De Smet發布的C#4.0教科書(第1466頁),使用新線程應該意味着使用的線程比使用我的代碼中注釋掉的ThreadPool.QueueUserWorkItem要多得多。 但是我已經嘗試了兩種,並且在資源監視器中看到“新線程”,分配了大約11個線程,但是當我使用ThreadPool.QueueUserWorkItem時,大約有50個。為什么我得到的結果與提到的相反。在這本書?
另外,為什么如果增加睡眠時間,在使用ThreadPool.QueueUserWorkItem時是否會分配更多的線程?
new Thread()
只創建一個Thread對象; 你忘了調用Start()
(它創建你在資源監視器中看到的實際線程)。
此外,如果您在睡眠完成后查看線程數,您將看不到任何new Thread
因為它們已經退出。 另一方面, ThreadPool
將線程保持一段時間以便它可以重用它們,因此在這種情況下,即使在睡眠完成后你仍然可以看到線程。
使用new Thread()
,您可能會看到數字保持在160左右,因為啟動那么多線程需要一秒鍾,因此在第161個線程啟動時,第一個線程已經完成。 如果增加睡眠時間,您應該看到更多的線程。
至於ThreadPool
,它被設計為使用盡可能少的線程,同時也保持CPU忙。 理想情況下,繁忙線程的數量等於CPU核心的數量。 但是,如果池檢測到其線程當前未使用CPU(正在休眠或等待另一個線程),則會啟動更多線程(速率為1 /秒,最高達到某個最大值)以保持CPU忙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.