在需要建立的線程很多,且都是比較小的線程的情況下,可以使用線程池(ThreadPool類)。ThreadPool是一個靜態方法,提供了對一個線程集合的操作,它會線上程數不足時增加線程,空閑線程數過多時釋放資源。
1、ThreadPool簡單應用
調用ThreadPool.QueueUserWorkItem()方法,傳遞一個WaitCallBack委託類型的方法,並把這個方分配給線程池中的線程。線程池是自動啟動並執行,如果線程池還沒有運行,就會建立一個線程池,並啟動第一個線程。如果線程池己經在運行,且有一個空閑線程來完成該任務,就把該作業傳遞給這個線程。
下面這個方法是一個符合WaitCallBack委託的方法:
1: static void WaitCallBackMethod(object param)
2: {
3: for (int i = 0; i < 5; i++)
4: {
5: Console.WriteLine(String.Format("Thread {0} is running", param));
6: Thread.Sleep(1000);
7: }
8: }
然後在主線程裡給線程池添加方法:
1: static void Main(string[] args)
2: {
3: for (int i = 1; i <= 3; i++)
4: {
5: ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
6: }
7: Console.Read();
8: }
QueueUserWorkItem()方法的第二個參數是個object類型的參數,可傳入一個資料到線程中。在主線程中,傳入了3個方法到線程池中。運行結果如下:
可以看見三個線程分別在行動。順序不一樣是因為作業系統調度的原因。
2、最大與最小線程數
ThreadPool類會在需要時增減池中線程的線程數,直到最大的線程數。池中的最大線程數是可配置的。在雙核CPU中,預設設定為1023個背景工作執行緒和1000個I/O線程。也可以指定在建立線程池時應立即啟動的最小線程數,以及線程池,中可用的最大線程數。如果有更多的作業要處理,線程池中線程的個數也到了極限,最新的作業就要排隊,且必須等待線程完成其任務。
可用下面的方法查看:
1: static void MaxThreads()
2: {
3: int workerThreads;
4: int ioThreads;
5:
6: ThreadPool.GetMaxThreads(out workerThreads, out ioThreads);
7: Console.WriteLine(String.Format("Max worker threads: {0}; Max I/O threads: {1}", workerThreads, ioThreads));
8:
9: ThreadPool.GetMinThreads(out workerThreads, out ioThreads);
10: Console.WriteLine(String.Format("Min worker threads: {0}; Min I/O threads: {1}", workerThreads, ioThreads));
11: }
結果為:
3、線程池的限制
- 線程池中的所有線程都是後台線程。如果進程的所有前台線程都結束了,所有的後台線程就會停止。不能把入池的線程改為前台線程。
- 不能給入池的線程設定優先權或名稱。
- 對於COM對象,入池的所有線程都是多執行緒 Apartment(Multithreaded Apartment,MTA)線程。許多COM對象都需要單一執行緒 Apartment(Multithreaded Apartment,MTA)線程。
- 入池的線程只能用於時間較短的任務。如果線程要一直運行(如Word的拼字檢查器線程),就應使用Thread類建立一個線程。
參考資料:《C#進階編程》
http://www.cnblogs.com/sosowjb/archive/2012/08/11/2633793.html