C# 線程池ThreadPool的用法簡析
可見 https sdn 而是 plain call 計時器 最大線程數 water
3. 怎麽使用線程池?
https://blog.csdn.net/smooth_tailor/article/details/52460566
什麽是線程池?為什麽要用線程池?怎麽用線程池?
1. 什麽是線程池?
.NET Framework的ThreadPool類提供一個線程池,該線程池可用於執行任務、發送工作項、處理異步 I/O、代表其他線程等待以及處理計時器。那麽什麽是線程池?線程池其實就是一個存放線程對象的“池子(pool)”,他提供了一些基本方法,如:設置pool中最小/最大線程數量、把要執行的方法排入隊列等等。ThreadPool是一個靜態類,因此可以直接使用,不用創建對象。
2. 為什麽要用線程池?好處是什麽?
微軟官網說法如下:許多應用程序創建大量處於睡眠狀態,等待事件發生的線程。還有許多線程可能會進入休眠狀態,這些線程只是為了定期喚醒以輪詢更改或更新的狀態信息。 線程池,使您可以通過由系統管理的工作線程池來更有效地使用線程。
說得簡單一點,每新建一個線程都需要占用內存空間和其他資源,而新建了那麽多線程,有很多在休眠,或者在等待資源釋放;又有許多線程只是周期性的做一些小工作,如刷新數據等等,太浪費了,划不來,實際編程中大量線程突發,然後在短時間內結束的情況很少見。於是,就提出了線程池的概念。線程池中的線程執行完指定的方法後並不會自動消除,而是以掛起狀態返回線程池,如果應用程序再次向線程池發出請求,那麽處以掛起狀態的線程就會被激活並執行任務,而不會創建新線程,這就節約了很多開銷。只有當線程數達到最大線程數量,系統才會自動銷毀線程。因此,使用線程池可以避免大量的創建和銷毀的開支,具有更好的性能和穩定性,其次,開發人員把線程交給系統管理,可以集中精力處理其他任務。
3. 怎麽使用線程池?
其實線程池使用起來很簡單,如下
a.設置線程池最大最小:
ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads)
設置可以同時處於活動狀態的線程池的請求數目。所有大於此數目的請求將保持排隊狀態,直到線程池線程變為可用。還可以設置最小線程數。
b.將任務添加進線程池:
ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));
或
ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 參數);
舉個小例子,線程池中最多5個線程,執行一個方法60次,算5年總工資,如下:
如果不采用線程池,恐怕要開60線程異步執行Run()方法,空間資源之浪費,可見一斑。而現在我們最多用了5個線程,1秒內即可執行完畢,效率、性能都很好。
留言
張貼留言