[英]Thread-pool don't use threads as expected?
我試圖查看當我極端使用線程池時線程池會發生什么:
所以我運行了這個測試:
void Main()
{
int AvaliableWorker,AvaliableioCompletion,MaxWorker,MaxioCompletion;
for (int i=0;i<1028;i++) Task.Factory.StartNew(()=>{Thread.Sleep(5000);});
Thread.Sleep(2000); // give the loop some time to run threads....
ThreadPool.GetAvailableThreads(out AvaliableWorker, out AvaliableioCompletion);
Console.WriteLine("{0} / {1}", AvaliableWorker, AvaliableioCompletion);
ThreadPool.GetMaxThreads(out MaxWorker, out MaxioCompletion);
Console.WriteLine("{0} / {1}", MaxWorker, MaxioCompletion);
}
但是,當我在.net4/32bit
環境(控制台)上運行它時,得到以下結果:
**1015** / 1000
1023 / 1000
再次運行:
**1009** / 1000
1023 / 1000
問題是關於粗體數字:
題
Fw.4
設置默認的最大線程池工作線程最大創建數為1023
(如您所見)。
但是看着GetAvailableThreads
:
如果是這樣, 當我使1028線程進入睡眠狀態時 ,為什么我仍然會得到1015 , 1009
這樣的大值?
我的意思是, 1023-1028 = negative number
:(換句話說: “我的朋友不再有線程,我現在將通過每秒2個線程按需創建它們, 但這是另一個不相關的主題 )”
當我使1028個線程進入睡眠狀態時對嗎?
你沒有 您排隊約1000個任務,而不是(尚未)線程。 當您WriteLine()結果時,仍在等待運行。
此時的實際池線程數:1023-1015 = 8。
使for循環后的Sleep()稍長一些(幾秒鍾),您將看到較少的可用線程,即較多的池線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.