線程池(ThreadPool)
一、簡介
前面介紹了平時用到的大多數的多線程的例子,但在實際開發中使用的線程往往是大量的和更為復雜的,這時,每次都創建線程、啟動線程。從性能上來講,這樣做並不理想(因為每使用一個線程就要創建一個,需要占用系統開銷);從操作上來講,每次都要啟動,比較麻煩。為此引入的線程池的概念。
好處:
1.減少在創建和銷毀線程上所花的時間以及系統資源的開銷
2.如不使用線程池,有可能造成系統創建大量線程而導致消耗完系統內存以及”過度切換”。
在什么情況下使用線程池?
1.單個任務處理的時間比較短
2.需要處理的任務的數量大
線程池最多管理線程數量=“處理器數 * 250”。也就是說,如果您的機器為2個2核CPU,那么CLR線程池的容量默認上限便是1000。通過線程池創建的線程默認為后台線程,優先級默認為Normal。
二、代碼
案例一:
class Program { static void Main(string[] args) { ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod1), new object()); //參數可選 Console.ReadKey(); } public static void ThreadMethod1(object val) { for (int i = 0; i <= 10000; i++) { if (i % 1000 == 0) { if (string.IsNullOrEmpty(Thread.CurrentThread.Name) ) { Thread.CurrentThread.Name = "Thred_" + i; } Console.WriteLine("循環{0}次的線程的線程名稱為:{1}",i,Thread.CurrentThread.Name); } } } }
運行結果:
案例二:
class Program { public static void Main() { // Queue the task. ThreadPool.QueueUserWorkItem(ThreadProc); Console.WriteLine("Main thread does some work, then sleeps."); Thread.Sleep(1000); Console.WriteLine("Main thread exits."); Console.ReadKey(); } // This thread procedure performs the task. static void ThreadProc(Object stateInfo) { // No state object was passed to QueueUserWorkItem, so stateInfo is null. Console.WriteLine("Hello from the thread pool."); } }
運行結果: