1. 程式人生 > >任務,執行緒和同步(四)之ThreadPool(執行緒池)

任務,執行緒和同步(四)之ThreadPool(執行緒池)

執行緒池

任務後臺基礎:執行緒池。建立執行緒需要時間。如果有不同的短任務要完成,就可以事先建立許多執行緒,在應完成這些任務時發出請求,這個執行緒最好在需要更多的執行緒時增加,在需要釋放資源時減少。
不需要自己建立這樣的一個列表,該表由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