任務,執行緒和同步(四)之ThreadPool(執行緒池)
阿新 • • 發佈:2019-02-19
執行緒池
任務後臺基礎:執行緒池。建立執行緒需要時間。如果有不同的短任務要完成,就可以事先建立許多執行緒,在應完成這些任務時發出請求,這個執行緒最好在需要更多的執行緒時增加,在需要釋放資源時減少。
不需要自己建立這樣的一個列表,該表由ThreadPool類託管,這個類會在需要時增減池中執行緒的執行緒數,直到達到最大執行緒數。池中的最大執行緒數是可配置的。在4核cpu中,預設設定為1023個工作執行緒,和1000個I/O執行緒,也可以指定在建立執行緒池時立即啟動最小執行緒數,以及執行緒池中可用的最大執行緒數。如果有更多的作業需要處理,執行緒池中的執行緒的個數達到了極限,最新的作業就要排隊,且必須等待執行緒完成其他任務。
下面的圖中的方法QueueUserWorkItem()用傳遞委託
程式碼如下:
static void Main()
{
int nWorkerThreads;
int nCompletionPortThreads;
ThreadPool.GetMaxThreads(out nWorkerThreads,out nCompletionPortThreads);
Console.WriteLine("Max worker threads:{0},"+"I/O completion threads:{1}" ,nWorkerThreads,nCompletionPortThreads);
for (int i = 0; i <5; i++)
{
ThreadPool.QueueUserWorkItem(JobForThread);
}
Console.ReadKey();
}
static void JobForThread(object state)
{
for (int i = 0; i < 3 ; i++)
{
Console.WriteLine("是否是執行緒池中執行緒:{0}", Thread.CurrentThread.IsThreadPoolThread);
Console.WriteLine("loop {0},running inside pooled thread {1}",i,Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5);
}
}
執行程式時,可以看到1023個工作執行緒的當前設定。5個任務由4個執行緒池中的執行緒處理,(因為這是一個四核系統)
執行緒池使用起來很簡單,但它有一些限制:
- 執行緒中的所有執行緒都是後臺執行緒,如果前臺執行緒結束了,所有後臺執行緒就會停止。不能把入池的執行緒給為前臺執行緒。
- 不能給入池的執行緒設定優先順序或名稱
- 對於com物件,入池的所有執行緒都是多執行緒單元執行緒,許多com物件都需要單執行緒單元執行緒
- 入池的執行緒只能用於時間較短的任務。如果執行緒要一直執行(如:word的拼寫檢查器執行緒)就要使用Thread類建立一個執行緒或者Task使用LongRunning