1. 程式人生 > 其它 >C# ThreadPool類(執行緒池) C# ThreadPool類(執行緒池)

C# ThreadPool類(執行緒池) C# ThreadPool類(執行緒池)

C# ThreadPool類(執行緒池)

CLR執行緒池並不會在CLR初始化時立即建立執行緒,而是在應用程式要建立執行緒來執行任務時,執行緒池才初始化一個執行緒。

執行緒池初始化時是沒有執行緒的,執行緒池裡的執行緒的初始化與其他執行緒一樣,
但是在完成任務以後,該執行緒不會自行銷燬,而是以掛起的狀態返回到執行緒池。
直到應用程式再次向執行緒池發出請求時,執行緒池裡掛起的執行緒就會再度啟用執行任務。
這樣既節省了建立執行緒所造成的效能損耗
可以讓多個任務反覆重用同一執行緒,從而在應用程式生存期內節約大量開銷。
通過CLR執行緒池所建立的執行緒總是預設為後臺執行緒,優先順序數為ThreadPriority.Normal。//Normal:正常的

 

CLR執行緒池分為工作者執行緒(workerThreads)與I/O執行緒(completionPortThreads)兩種:

 

工作者執行緒(workerThreads)是主要用作管理CLR內部物件的運作,通常用於計算密集的任務I/O(Input/Output)執行緒主要用於與外部系統互動資訊,
如輸入輸出,CPU僅需在任務開始的時候,將任務的引數傳遞給裝置,然後啟動硬體裝置即可。
等任務完成的時候,CPU收到一個通知,一般來說是一個硬體的中斷訊號,此時CPU繼續後繼的處理工作。
在處理過程中,CPU是不必完全參與處理過程的,如果正在執行的執行緒不交出CPU的控制權, 那麼執行緒也只能處於等待狀態,即使作業系統將當前的CPU排程給其他執行緒,此時執行緒所佔用的空間還是被佔用, 而並沒有CPU處理這個執行緒,可能出現執行緒資源浪費的問題

 

 

如果這是一個網路服務程式,每一個網路連線都使用一個執行緒管理,可能出現大量執行緒都在等待網路通訊,
隨著網路連線的不斷增加,處於等待狀態的執行緒將會很消耗盡所有的記憶體資源。可以考慮使用執行緒池解決這個問題。  

執行緒池的最大值一般預設為1000、2000。當大於此數目的請求時,將保持排隊狀態,直到執行緒池裡有執行緒可用。

 

使用CLR執行緒池的工作者執行緒一般有兩種方式:

通過ThreadPool.QueueUserWorkItem()方法;
通過委託;

要注意,不論是通過ThreadPool.QueueUserWorkItem()還是委託,呼叫的都是執行緒池裡的執行緒。

通過以下兩個方法可以讀取和設定CLR執行緒池中工作者執行緒與I
/O執行緒的最大執行緒數。 ThreadPool.GetMax(out in workerThreads,out int completionPortThreads); ThreadPool.SetMax(int workerThreads,int completionPortThreads);

 

檢視執行緒池中有多少執行緒正在投入使用:
可以通過ThreadPool.GetAvailableThreads(out in workThreads,out int conoletionPortThreads)方法。

方法    說明
GetAvailableThreads    剩餘空閒執行緒數
GetMaxThreads          最多可用執行緒數,所有大於此數目的請求將保持排隊狀態,直到執行緒池執行緒變為可用
GetMinThreads          檢索執行緒池在新請求預測中維護的空閒執行緒數
QueueUserWorkItem      啟動執行緒池裡得一個執行緒(佇列的方式,如執行緒池暫時沒空閒執行緒,則進入佇列排隊)
SetMaxThreads          設定執行緒池中的最大執行緒數
SetMinThreads          設定執行緒池最少需要保留的執行緒數

 

使用執行緒池有如下優點

 

1、縮短應用程式的響應時間。因為線上程池中有執行緒的執行緒處於等待分配任務狀態(只要沒有超過執行緒池的最大上限),無需建立執行緒。
2、不必管理和維護生存週期短暫的執行緒,不用在建立時為其分配資源,在其執行完任務之後釋放資源。
3、執行緒池會根據當前系統特點對池內的執行緒進行優化處理。

總之使用執行緒池的作用就是減少建立和銷燬執行緒的系統開銷。在.NET中有一個執行緒的類ThreadPool,它提供了執行緒池的管理。

 

ThreadPool是一個靜態類,它沒有建構函式,對外提供的函式也全部是靜態的

 

//將方法排入佇列以便執行。此方法在有執行緒池執行緒變得可用時執行。
public static bool QueueUserWorkItem(WaitCallback callBack)

//將方法排入佇列以便執行,並指定包含該方法所用資料的物件。此方法在有執行緒池執行緒變得可用時執行。
public static bool QueueUserWorkItem(WaitCallback callBack,Object state)

QueueUserWorkItem方法中使用的的WaitCallback引數表示一個delegate,它的宣告如下:
public delegate void WaitCallback(Object state)

如果需要傳遞任務資訊可以利用WaitCallback中的state引數,類似於ParameterizedThreadStart委託。