接上文 多執行緒程式設計學習筆記——執行緒同步(一)
接上文 多執行緒程式設計學習筆記——執行緒同步(二)
接上文 多執行緒程式設計學習筆記——執行緒同步(三)
建立多執行緒操作是非常昂貴的,所以每個執行時間非常短的操作,建立多執行緒進行操作,可能並不能提高效率,反而降低了效率。
執行緒池,就是我們先分配一些資源到池子裡,當我們需要使用時,則從池子中獲取,用完了,再放回池子裡。
.net中的執行緒池是受clr管理的,theadtool類有乙個queueuserworkitem靜態方法,這個靜態方法接受乙個委託,代表使用者自定義的乙個非同步操作,在這個方法被呼叫之後,委託會進入到內部佇列中,如果池中沒有執行緒,則建立乙個工作執行緒,把第乙個委託放入工作執行緒。如果繼續放入委託,則池建立新的工作執行緒,直到工作執行緒數量達到上限。這時再放入委託,則不會建立新的工作執行緒,而是在佇列中等待,直到有空閒的工作執行緒。
當執行緒池中所有操作都完成,而且沒有新任務操作時,執行緒池會釋放長時間不用的資源。
注意:放入執行緒池中的操作需要的時間要短,不要把需要長時間執行的操作放入執行緒池中,或阻塞工作執行緒。這將導致效能問題和非常難以呼叫的問題。
在asp.net中使用執行緒池要當心,asp.net中的執行緒池是乙個共用執行緒池,如果執行緒池中的工作執行緒都用完了,則會造成web伺服器對正常的http請求無法提供服務。
一、 執行緒池中呼叫委託
1.**如下:
using2.程式執行結果如下圖。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)}}
上面的程式執行時,我們首先建立執行緒來執行委託操作,然後呼叫委託的begininvoke來執行**方法,這個**函式會在非同步操作完成之後會被呼叫,並且會把乙個自定義的值傳給這個**函式,最後我們會得到乙個實現了iasyncresult介面的result物件,當執行緒池的工作執行緒在進行工作時,允許我們繼續其他操作。我們可以輪詢result物件的iscompleted屬性,確定操作是否完成。也可以呼叫endinvoke將iasyncresult傳給委託引數。
二、 執行緒池中放入非同步操作
1.**如下:
using2.執行結果如下。程式執行了兩次。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
); } }}
程式首先定義了乙個asyncoper方法,然後使用queueuserworkitem將這個方法放入執行緒池中,然後再次放入乙個asyncoper方法,不過這次給方法呼叫傳乙個物件。
**中的呼叫thread.sleep方法,是為了讓執行緒池中的工作執行緒為新操作重用。請注意列印出來的thradid,如果threadid一樣則證明兩個操作重用了同乙個工作執行緒。
多執行緒程式設計學習筆記 執行緒池(三)
接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個threadpool.registerwaitforsingleobject,這個方法允許我們將 函式放入執行緒池中的佇列中。當提供的等待事件處理器接收到訊號或發生超時時,這個 函式將被呼叫...
執行緒池 多執行緒學習筆記(三)
執行緒池產生原因 建立很多執行緒造成的兩個問題 1.構建乙個新的執行緒會涉及到與作業系統的互動,會消耗一定的系統資源,當使用完這些新建立的執行緒後,執行緒就會被銷毀,然後當我們再建立的時候就會再次消耗系統資源,所以如果建立很多生命期很短的執行緒,就會消耗很大的系統資源,甚至給系統帶來很大的壓力。2....
多執行緒程式設計 執行緒池 threadpool
很多公司裡,雇員通常會在辦公室度過他們的辦公時光 偶爾也會外出訪問客戶或 商 或是參加 展會。雖然外出可能很有必要,並且可能需要很多人一起去,不過對於一些特別的雇員來說,一趟可能就是幾個月,甚至是幾年。公司要給每個雇員都配一輛車,這基本上是不可能的,不過公司可以提供一些共用車輛 這樣就會有一定數量車...