在多執行緒的程式中,經常會出現兩種情況:
一種情況: 應用程式中,執行緒把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應
這一般使用threadpool(執行緒池)來解決;
另一種情況:執行緒平時都處於休眠狀態,只是周期性地被喚醒
這一般使用timer(定時器)來解決;
threadpool類提供乙個由系統維護的執行緒池(可以看作乙個執行緒的容器),該容器需要 windows 2000 以上系統支援,因為其中某些方法呼叫了只有高版本的windows才有的api函式。
//將乙個執行緒放進執行緒池,該執行緒的start()方法將呼叫waitcallback**物件代表的函式
public static bool queueuserworkitem(waitcallback);
在這裡你無需自己建立執行緒,只需把你要做的工作寫成函式,然後作為引數傳遞給threadpool.queueuserworkitem()方法就行了,傳遞的方法就是依靠waitcallback**物件,而執行緒的建立、管理、執行等工作都是由系統自動完成的,你無須考慮那些複雜的細節問題。
threadpool 的用法:
首先程式建立了乙個manualresetevent物件,該物件就像乙個訊號燈,可以利用它的訊號來通知其它執行緒。
本例中,當執行緒池中所有執行緒工作都完成以後,manualresetevent物件將被設定為有訊號,從而通知主線程繼續執行。
manualresetevent物件有幾個重要的方法:
初始化該物件時,使用者可以指定其預設的狀態(有訊號/無訊號);
在初始化以後,該物件將保持原來的狀態不變,直到它的reset()或者set()方法被呼叫:
reset()方法:將其設定為無訊號狀態;
set()方法:將其設定為有訊號狀態。
waitone()方法:使當前執行緒掛起,直到manualresetevent物件處於有訊號狀態,此時該執行緒將被啟用。然後,程式將向執行緒池中新增工作項,這些以函式形式提供的工作項被系統用來初始化自動建立的執行緒。當所有的執行緒都執行完了以後,manualresetevent.set()方法被呼叫,因為呼叫了manualresetevent.waitone()方法而處在等待狀態的主線程將接收到這個訊號,於是它接著往下執行,完成後邊的工作。
using
system;
using
system.collections;
using
system.threading;
namespace
threadexample
}public
class
alpha
//執行緒池裡的執行緒將呼叫beta()方法
public
void
beta(object state)
:", thread.currentthread.gethashcode(),((somestate)state).cookie);
console.writeline(
"hashcount.count==, thread.currentthread.gethashcode()==
", hashcount.count, thread.currentthread.gethashcode());
lock
(hashcount)
intix
=2000
;thread.sleep(ix);
操作是乙個原子操作,具體請看下面說明
interlocked.increment(
reficount);
if(icount
==imaxcount)}}
public
class
******pool
items to thread pool
", maxcount);
alpha oalpha
=new
alpha(maxcount);
//建立工作項
//注意初始化oalpha物件的eventx屬性
oalpha.eventx
=eventx;
console.writeline(
"queue to thread pool 0");
trycatch
(notsupportedexception)
if(w2k)
//如果當前系統支援threadpool的方法.
", iitem);
threadpool.queueuserworkitem(
newwaitcallback(oalpha.beta),
newsomestate(iitem));
}console.writeline(
"waiting for thread pool to drain");
//等待事件的完成,即執行緒呼叫manualresetevent.set()方法
eventx.waitone(timeout.infinite,
true
);//
waitone()方法使呼叫它的執行緒等待直到eventx.set()方法被呼叫
console.writeline(
"thread pool has been drained (event fired)");
console.writeline();
console.writeline(
"load across threads");
foreach
(object
o in
oalpha.hashcount.keys)
console.writeline("
", o, oalpha.hashcount[o]);
}console.readline();
return0;
}}}}
ThreadPool 執行緒池 c
正文 threadpool 執行緒池 是乙個靜態類,它沒有定義任何的構造方法 我們只能夠使用它的靜態方法,這是因為threadpool是託管執行緒池,是由clr管理的。threadpool使用waitcallback委託,它所要做的工作是在後台進行的。使工作項的排隊和執行更容易,可以給工作者執行緒傳...
執行緒池 Thread Pool
烽驛2009開源實時通訊平台 原始碼獲取 svn checkouthttp fy2009.googlecode.com svn trunk fy2009 read only 眾所周知,執行緒並非越多越好,理論上乙個cpu 或core 乙個活動執行緒可獲得最佳效能。執行緒池可根據具體硬體的情況 如cp...
ThreadPool(執行緒池)
任務後台基礎 執行緒池。建立執行緒需要時間。如果有不同的短任務要完成,就可以事先建立許多執行緒,在應完成這些任務時發出請求,這個執行緒最好在需要更多的執行緒時增加,在需要釋放資源時減少。不需要自己建立這樣的乙個列表,該錶由threadpool類託管,這個類會在需要時增減池中線程的執行緒數,直到達到最...