理解執行緒池 外加乙個Word模擬程式

2022-02-11 19:17:48 字數 1899 閱讀 6523

理解執行緒池——外加乙個word模擬程式執行緒池在被建立時會帶有很多個工作執行緒,對於每個傳入的請求,執行緒池都將分配乙個執行緒,因此可以非同步處理請求,而不會占用主線程,也不會延遲後續請 求的處理。一旦池中的某個執行緒完成了任務,它將返回到執行緒池執行緒佇列中等待,等待被再次徵用。這種重用使應用程式可以避免為每個任務建立新執行緒的開銷。線 程池通常具有最大執行緒數限制,如果所有執行緒都繁忙,則額外的任務將放入佇列中,直到有執行緒可用時才能夠得到處理。說到這裡,有沒有發現執行緒池有點像現實生 活中的導遊公司,來乙個旅遊團,導遊公司會為旅遊團分配乙個導遊(相當於執行緒),當導遊公司的導遊不夠時,新來的旅遊團也會被放入「任務佇列」中等待。

執行緒池中的執行緒預設為後台執行緒,即它們的isbackground 屬性為 true。這意味著在所有的前台執行緒都已退出後,執行緒池執行緒會自動關閉。執行緒池通過執行緒命名空間的threadpool類來實現,要請求由執行緒池中的乙個 執行緒來處理你的任務,需要呼叫queueuserworkitem方法。此方法是乙個靜態方法,它使用乙個委託例項作為引數,這個委託例項代表你要請求線 程池所執行的任務。要注意,當你向執行緒池提交乙個任務請求後,你就無法再取消它了。另外,執行緒池中每個執行緒按照預設的優先順序執行。

向執行緒池提交任務使用waitcallback委託,我們只需要向queueuserworkitem方法傳乙個waitcallback委託的實 例就可以向執行緒池新增乙個任務。執行緒池針對這個任務會自動呼叫乙個執行緒來處理。下面是waitcallback委託的定義原型:

public delegate void waitcallback (object state);

從這個委託我們可以看出兩件事情,一是向執行緒池提交的處理方法必須是waitcallback委託型別的,從這個委託的型別可以看出委託能夠處理方 法的型別,即此方法要帶乙個object引數並且沒有返回值。另外關於委託的引數state,其實是主線程傳遞給處理執行緒的引數,利用這個引數你可以實現 主線程和子執行緒簡單的通訊。

執行結果:

這個例子我們向執行緒池提交了三個任務,執行緒池接受到任務後會自動安排執行緒處理。在這裡我們使用了帶有兩個引數的 queueuserworkitem,第乙個引數就是提交的任務(也就是方法),第二個引數是傳遞給執行緒處理方法的引數物件。對於 queueuserworkitem方法來說,還有另一種只帶有乙個waitcallback引數的形式,當你不需要通過主線程傳遞引數給處理執行緒時可以 採用這種形式,如:

threadpool.queueuserworkitem(new waitcallback(this.print));

另外自己不要結束執行緒池中的執行緒,執行緒池建立執行緒並負責結束它們。當你遇到無法判斷是執行緒池執行緒還是自定義執行緒時,你可以通過執行緒的isthreadpoolthread屬性來判斷該執行緒是否是執行緒池執行緒,如果不是執行緒池的執行緒你才可以結束它:

if( !thread.currentthread.isthreadpoolthread ) thread.currentthread.abort();

執行緒池和執行緒一樣不要隨便使用,微軟的msdn為我們歸納了不用執行緒池的情況,從中你可看出執行緒和執行緒池的一些區別,比如執行緒可以是後台或前台執行緒,而執行緒池一定是後台執行緒等等。

在以下幾種情況下,適合於建立並管理自己的執行緒而不是使用執行緒池執行緒:

需要前台執行緒。

需要使執行緒具有特定的優先順序。

你的任務會導致執行緒長時間被阻止,由於執行緒池具有最大執行緒數限制,因此大量阻塞的執行緒池執行緒可能會阻止任務啟動。

你需要具有與執行緒關聯的屬性時,或使某一線程專用於某一任務時。

對於需要大量執行緒的專案,可以考慮執行緒池,因為執行緒池能夠簡化你對執行緒管理的難度並且可以提高應用程式的效能,而且執行緒池也可以自動管理執行緒使其適 應於多個cpu的情況。執行緒的相關語法和使用我們就介紹到這裡,可能你對執行緒的使用還是有點不知所措,我們將在後面介紹一些執行緒使用相關的內容,它們會幫 助你理解執行緒的使用。

理解執行緒池 外加乙個Word模擬程式

理解執行緒池 外加乙個word模擬程式執行緒池在被建立時會帶有很多個工作執行緒,對於每個傳入的請求,執行緒池都將分配乙個執行緒,因此可以非同步處理請求,而不會占用主線程,也不會延遲後續請 求的處理。一旦池中的某個執行緒完成了任務,它將返回到執行緒池執行緒佇列中等待,等待被再次徵用。這種重用使應用程式...

linux程式設計 模擬實現乙個執行緒池

實現乙個執行緒池需要構建三個類 執行緒任務類給定兩個介面,settask 負責把給的資料和方法傳進任務系統,start 負責將給定資料用給定方法來處理。安全佇列類,負責給執行緒池提供乙個能夠互斥訪問的安全佇列。執行緒池類提供三個介面,threadpool 建立指定數量的執行緒,taskpush 將任...

實現乙個執行緒池

一.執行緒最主要的三個同步機制 1.訊號量 2.互斥鎖 3.條件變數 二.對三個同步機制分別實現乙個包裝類 ifdef locker h define locker h include include 訊號量的封裝 class sem sem bool wait bool post private ...