什么是線程池(Pool)?
水池裝水,線程池裝線程。池(Pool)是一個很常見的提高性能的方式,之所以有這些池是因為線程和數據庫連接的創建和關閉是一種比較昂貴的行為。對于這種昂貴的資源我們往往會考慮在一個池容器中放置一些資源,在用的時候去拿,在不夠的時候添點,在用完就歸還,這樣就可以避免不斷的創建資源和銷毀資源。
最大線程(MaxThreads)?
池中能容納的最大線程數,就好比一個5L的水桶,硬是要裝10L的水肯定是裝不下的,線程池也一樣,可以使用SetMaxThreads來設置最大線程,如果不設置,系統會根據當前計算機的配置來計算默認最大線程。
最小線程(MinThreads)?
之所以使用線程池是不希望線程在創建后運行結束后理解回收,這樣的話以后要用的時候還需要創建,我們可以讓線程池至少保留幾個線程,即使沒有線程在工作也保留。
簡單示例:
首先,我們設置線程池最大線程是 300 個,最小線程是100個。 然后,我們需要有500個線程需要創建,每個線程執行需要10秒、
using System;using System.Collections.Concurrent;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Timers;namespace Consoleapplication39{ class PRogram { static void Main(string[] args) { int workerThreads, completionPortThreads; //設置線程池中最大線程為300個 ThreadPool.SetMaxThreads(300, 300); //線程池空閑線程100個,即沒有線程在工作線程池中也要保留100個線程 ThreadPool.SetMinThreads(100, 100); ThreadPool.GetMaxThreads(out workerThreads, out completionPortThreads); //輸出:線程池中最大工作線程300個,IO線程300個 Console.WriteLine("線程池中最大工作線程{0}個,IO線程{1}個/n", workerThreads, completionPortThreads); //聲明一個線程回調的委托 WaitCallback callback = ExecuteMethod; //申請10個線程執行 for (int i = 0; i < 500; i++) { //如果線程池中有線程,就執行回調方法 ThreadPool.QueueUserWorkItem(callback); Thread.Sleep(10); } Console.ReadLine(); } private static int i = 1; public static void ExecuteMethod(object state) { Console.WriteLine("第{0}個工作線程正在運行/n", i); i++; //每個線程執行5秒 Thread.Sleep(10000); } }}運行效果可以看出來,前100個線程很快就能申請成功并執行.
而后,線程池最小100個空閑線程已經使用完了之后,線程池需要創建新的線程,這個線程申請的時間視.net framework而定,默認大概半秒鐘。(這里執行明顯就慢了許多)
10秒之后,最初的100個線程已經運行完了,將會還給線程池,此時池中又有100個空閑線程可以使用了。(這里執行又快了)
新聞熱點
疑難解答