多執行緒程式設計學習筆記 執行緒池(一)

2022-02-09 07:43:27 字數 3237 閱讀 3589

接上文 多執行緒程式設計學習筆記——執行緒同步(一)

接上文 多執行緒程式設計學習筆記——執行緒同步(二)

接上文 多執行緒程式設計學習筆記——執行緒同步(三)

建立多執行緒操作是非常昂貴的,所以每個執行時間非常短的操作,建立多執行緒進行操作,可能並不能提高效率,反而降低了效率。

執行緒池,就是我們先分配一些資源到池子裡,當我們需要使用時,則從池子中獲取,用完了,再放回池子裡。

.net中的執行緒池是受clr管理的,theadtool類有乙個queueuserworkitem靜態方法,這個靜態方法接受乙個委託,代表使用者自定義的乙個非同步操作,在這個方法被呼叫之後,委託會進入到內部佇列中,如果池中沒有執行緒,則建立乙個工作執行緒,把第乙個委託放入工作執行緒。如果繼續放入委託,則池建立新的工作執行緒,直到工作執行緒數量達到上限。這時再放入委託,則不會建立新的工作執行緒,而是在佇列中等待,直到有空閒的工作執行緒。

當執行緒池中所有操作都完成,而且沒有新任務操作時,執行緒池會釋放長時間不用的資源。

注意:放入執行緒池中的操作需要的時間要短,不要把需要長時間執行的操作放入執行緒池中,或阻塞工作執行緒。這將導致效能問題和非常難以呼叫的問題。

在asp.net中使用執行緒池要當心,asp.net中的執行緒池是乙個共用執行緒池,如果執行緒池中的工作執行緒都用完了,則會造成web伺服器對正常的http請求無法提供服務。

一、     執行緒池中呼叫委託

1.**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

threadpooldemo "

,threadid);

iasyncresult r = pooldele.begininvoke(out threadid, callback, "");

string result = pooldele.endinvoke(out

threadid, r);

console.writeline(

"執行緒池中工作執行緒id :

", threadid);

console.writeline(

"返回結果:

",result);

thread.sleep(

2000

); console.read();

}private

static

void

callback(iasyncresult r)

",r.asyncstate);

console.writeline(""

, thread.currentthread.isthreadpoolthread);

console.writeline(""

, thread.currentthread.managedthreadid);

}private

static

string runthread(out

intthreadid)}}

2.程式執行結果如下圖。

上面的程式執行時,我們首先建立執行緒來執行委託操作,然後呼叫委託的begininvoke來執行**方法,這個**函式會在非同步操作完成之後會被呼叫,並且會把乙個自定義的值傳給這個**函式,最後我們會得到乙個實現了iasyncresult介面的result物件,當執行緒池的工作執行緒在進行工作時,允許我們繼續其他操作。我們可以輪詢result物件的iscompleted屬性,確定操作是否完成。也可以呼叫endinvoke將iasyncresult傳給委託引數。

二、     執行緒池中放入非同步操作

1.**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

threadpooldemo "

, status);

console.writeline(

"執行緒池中工作執行緒id :

", thread.currentthread.managedthreadid);

thread.sleep(timespan.fromseconds(

2));

},"工作狀態");

threadpool.queueuserworkitem(_ => ,

", x+y,workstate);

console.writeline(

"執行緒池中工作執行緒id :

", thread.currentthread.managedthreadid);

thread.sleep(timespan.fromseconds(

2));

}, "工作狀態

");

thread.sleep(

2000

); console.read();

}private

static

void asyncoper(object

status)

",status??"

null");

console.writeline(""

, thread.currentthread.managedthreadid);

thread.sleep(

2000

); } }}

2.執行結果如下。程式執行了兩次。

程式首先定義了乙個asyncoper方法,然後使用queueuserworkitem將這個方法放入執行緒池中,然後再次放入乙個asyncoper方法,不過這次給方法呼叫傳乙個物件。

**中的呼叫thread.sleep方法,是為了讓執行緒池中的工作執行緒為新操作重用。請注意列印出來的thradid,如果threadid一樣則證明兩個操作重用了同乙個工作執行緒。

多執行緒程式設計學習筆記 執行緒池(三)

接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個threadpool.registerwaitforsingleobject,這個方法允許我們將 函式放入執行緒池中的佇列中。當提供的等待事件處理器接收到訊號或發生超時時,這個 函式將被呼叫...

執行緒池 多執行緒學習筆記(三)

執行緒池產生原因 建立很多執行緒造成的兩個問題 1.構建乙個新的執行緒會涉及到與作業系統的互動,會消耗一定的系統資源,當使用完這些新建立的執行緒後,執行緒就會被銷毀,然後當我們再建立的時候就會再次消耗系統資源,所以如果建立很多生命期很短的執行緒,就會消耗很大的系統資源,甚至給系統帶來很大的壓力。2....

多執行緒程式設計 執行緒池 threadpool

很多公司裡,雇員通常會在辦公室度過他們的辦公時光 偶爾也會外出訪問客戶或 商 或是參加 展會。雖然外出可能很有必要,並且可能需要很多人一起去,不過對於一些特別的雇員來說,一趟可能就是幾個月,甚至是幾年。公司要給每個雇員都配一輛車,這基本上是不可能的,不過公司可以提供一些共用車輛 這樣就會有一定數量車...