池(Pool)是一個很常見的提高性能的方式。比如線程池連接池等,之所以有這些池是因為線程和數 據庫連接的創建和關閉是一種比較昂貴的行為。對於這種昂貴的資源我們往往會考慮在一個池容器中放置 一些資源,在用的時候去拿,在不夠的時候添點,在用完就歸還,這樣就可以避免不斷的創建資源和銷毀 資源。
如果您做過相關實驗的話可能會覺得不以為然,似乎開1000個線程也用不了幾百毫秒。我們要這麼想 ,對於一個高並發的環境來說,每一秒假設有100個請求,每個請求需要使用(開和關)10個線程,也就 是一秒需要處理1000個線程的開和關,每個線程獨立堆棧1M,可以想象在這一秒中內存分配和回收是多麼 誇張,這個開銷不能說不昂貴。
首先,要理解線程池線程分為兩類工作線程和IO線程,可以單獨設置最小線程數和最大線程數:
ThreadPool.SetMinThreads(2, 2);
ThreadPool.SetMaxThreads(4, 4);
最大線程數很好理解,就是線程池最多創建這些線程,如果最大4個線程,現在這4個線程都在運行的 話,後續進來的線程只能排隊等待了。那麼為什麼有最小線程一說法呢?其實之所以使用線程池是不希望 線程在創建後運行結束後理解回收,這樣的話以後要用的時候還需要創建,我們可以讓線程池至少保留幾 個線程,即使沒有線程在工作也保留。上述語句我們設置線程池一開始就保持2個工作線程和2個IO線程, 最大不超過4個線程。
至於線程池的使用相當簡單先來看一段代碼:
for (int i = 0; i < totalThreads; i++)
{
ThreadPool.QueueUserWorkItem(o =>
{
Thread.Sleep(1000);
int a, b;
ThreadPool.GetAvailableThreads(out a, out b);
Console.WriteLine(string.Format("({0}/{1}) #{2} : {3}", a, b, Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("mm:ss")));
});
}
Console.WriteLine("Main thread finished");
Console.ReadLine();
代碼裡面用到了一個事先定義的靜態字段:
static readonly int totalThreads = 10;
代碼運行結果如下: