深入淺出多執行緒系列之三 執行緒池

2021-09-22 07:35:50 字數 2050 閱讀 7795

執行緒池:

每乙個執行緒缺省會被分配

1mb的記憶體,在

c#中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。

執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。

執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單個勞務工,然後完成任務就解雇她,

對勞務隊而言,勞務工完成了你的這個任務,還是會回到自己的團隊中的,勞務工的管理也不需要你去負責,因為這由勞務隊處理了,

如果任務太多了,勞務隊會自己招乙個勞務工,如果還不夠就繼續招,但是如果任務比較少,而勞務工又比較多的話,對不起,勞務隊的管理人員就會解雇一部分勞務工了。

有很多方法可以進入執行緒池:

借助

task parallel library(framework 4.0)

呼叫

threadpool.queueuserworkitem

借助非同步委託。

借助

backgroundworker.

下面的一些構造間接的使用了執行緒池:

wcf,remoting,asp.net, asmx web services

應用程式。

system.timers.timer

和system.threading.timer.

framework

的一些非同步方法,例如

webclient 

類,和大部分

begin***

方法。plinq

使用執行緒池的一些問題:

不可以設定乙個執行緒池執行緒的名字。

執行緒池執行緒全部都是後台執行緒。

阻塞乙個執行緒池執行緒可能會觸發建立乙個新執行緒,除非你呼叫

threadpool.setminthreads

方法。通過thread.currentthread.isthreadpoolthread

屬性可以查詢乙個執行緒是否是執行緒池執行緒。

實戰threadpool

1:通過

task

使用執行緒池:

public

static

void

mainthread()

static

string

downloadstring(

string

uri)

當查詢task.result的時候執行緒阻塞,等待task返回result。

2:通過

threadpool

.queueuserworkitem

public

static

void

mainthread()

static

void

go(object

data)

output:

hello from the thread pool!

hello from the thread pool! 123

3:借助委託的

begin***

方法:

public

static

void

mainthread()

static

intwork(

string

s) static

void

done(iasyncresult cookie)

在這裡將method當作引數進行傳遞後,在cookie的asyncstate中就可以使用傳遞的method了,

因為cookie.asyncstate型別是object,所以需要進行轉換,然後呼叫endinvoke方法來獲取結果。

深入淺出多執行緒系列之三 執行緒池

執行緒池 每乙個執行緒缺省會被分配 1mb的記憶體,在 c 中,這些都是實打實的分配的,當乙個執行緒啟動的時候,為了分配臨時堆疊大約需要花費幾百微秒的時間。執行緒池通過迴圈利用執行緒可以讓你更高效的利用執行緒。執行緒池就像外包的勞務隊一樣,有任務給他們,他們會管理勞務工的一切,你不需要去花時間去找單...

多執行緒系列(三) 執行緒池基礎

目錄 一 為什麼要使用執行緒池 執行緒池概念理解 備註 執行緒池中的執行緒是後台執行緒。1 為什麼會有執行緒池?因為建立執行緒和銷毀執行緒相對來說需要消耗大量的時間和資源。太多的執行緒會浪費記憶體。2 執行緒池是什麼?執行緒池就是乙個可持續性發展的執行緒集合,執行緒池內部維護著乙個訊息佇列。當一條方...

深入淺出多執行緒系列之二 關於Thread的那些事

1 你可以呼叫執行緒的例項方法join來等待乙個執行緒的結束。例如 public static void mainthread static void go 在列印了 1000個y 之後,後面就會輸出 thread t has ended 你可以在呼叫 join 方法的時候給它乙個 timeout ...