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

2022-01-15 01:16:21 字數 3115 閱讀 4699

目錄:

一、為什麼要使用執行緒池:執行緒池概念理解

備註:執行緒池中的執行緒是後台執行緒。

1、為什麼會有執行緒池?

因為建立執行緒和銷毀執行緒相對來說需要消耗大量的時間和資源。 太多的執行緒會浪費記憶體。

2、執行緒池是什麼?

執行緒池就是乙個可持續性發展的執行緒集合,執行緒池內部維護著乙個訊息佇列。

當一條方法名引用追加到執行緒池的佇列中,執行緒池會提取當前項,派發給執行緒池中空閒的執行緒。

3、執行緒池建立執行緒策略?

二、簡單的執行緒池操作

我們上面提到過,執行緒池內維護的了乙個訊息佇列,方法引用追加到佇列中,執行緒池中的執行緒從佇列中取出等待執行。

[securitysafecritical]

public

static

bool queueuserworkitem(waitcallback callback);

[securitysafecritical]

public

static

bool queueuserworkitem(waitcallback callback, object state);

委託:

[comvisible(true

)]

public

delegate

void waitcallback(object state);

所以,乙個是引數為null,乙個是需要傳遞實參的委託。要使用以上方式向佇列中新增工作項,其實是將方法引用新增到佇列中

1、我們定義乙個符合 waitcallback 規則的委託 乙個引數且沒有返回值

public

static

void workerfun(object

flag)

s", index);

thread.sleep(

2000

); }

console.writeline(

"【workerfun】end.");

}

2、我們使用執行緒池進行非同步呼叫

public

void run(string

args)

console.writeline(

"【main】sleep 5s.");

thread.sleep(5000);

console.writeline(

"【main】end.

");

}

執行結果:

主線程執行完畢,子執行緒自動關閉。所以說,執行緒池中的執行緒都是後台執行緒,優先順序比較低。

二、執行上下文

1、為什麼要有執行上下文 ?

執行緒在執行**時,會受到上下文的影響。

上下文會從初始執行緒流向輔助線程,這樣這整個執行緒使用相同的安全設定和宿主設定。

同樣,輔助線程可以使用初始執行緒的邏輯上下文。

namespace system.threading

//

執行上下文

public

sealed

class

executioncontext : idisposable, iserializable

通過執行上下文我們來控制上下文的流動。

callcontext.logicalsetdata("

name

", "sc"

);//

預設允許上下文進行流動

threadpool.queueuserworkitem(state => console.writeline("

name=

", callcontext.logicalgetdata("

name

")));

//現在禁止流動

executioncontext.suppressflow();

threadpool.queueuserworkitem(state => console.writeline("

name=

", callcontext.logicalgetdata("

name

")));

//恢復流動

executioncontext.restoreflow();

console.readkey();

執行:第一行允許流動;第二行禁止流動

name=sc

name=

三、協作式取消和超時需要取消的模式必須顯示支援取消

//

通知 system.threading.cancellationtoken,告知其應被取消

public

sealed

class cancellationtokensource : idisposable

cancellationtokensource  管理 著取消相關的狀態.

所謂協作式,首先我自己要支援取消,接收訊號後任務終止。

private

static

void count(system.threading.cancellationtoken token, int

countto)

", count);

if(token.iscancellationrequested)

",count);

break

; }}}

主線程中,接收協作式取消命令,子執行緒檢測到訊號後,主動停止。

public

void run(string

args)

執行結果:主線程發出回車訊號,子執行緒檢測到訊號後結束任務。

多執行緒系列三 執行緒常用方法

獲取當前執行緒 currentthread 該方法返回執行currentthread 這個方法當前執行緒的資訊 返回的是thread例項 使用這個方法可以獲取執行緒的名稱等 下面來看一下比較複雜的例子 public class threadmethodtest override public voi...

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

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

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

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