簡體   English   中英

ThreadPool.QueueUserWorkItem對新線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM