多线程中的ManualResetEvent
先來看一下簡單的多線程控制臺程序:
using?System;using?System.Threading;
namespace?ManualResetEventStudy
{
????class?ThreadClass
????{
????????static?void?t1()
????????{
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("t1的x:"?+?x);
????????????}
????????}
????????static?void?t2()
????????{
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("t2的x:"?+?x);
????????????}
????????}
????????static?void?Main(string[]?args)
????????{
????????????Thread?thrd1?=?new?Thread(t1);
????????????thrd1.Start();
????????????Thread?thrd2?=?new?Thread(t2);
????????????thrd2.Start();
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("主線程中的x:"?+?x);
????????????}
????????????Console.Read();
????????}???????
????}
}
?入口方法Main里,創(chuàng)建了二個線程,分別調(diào)用方法t1與t2,再加上主線程本身,一并有三個線程,運行后,三個線程都在計數(shù)輸出,結(jié)果類似如下:
t2的x:1
t1的x:1
主線程中的x:1
t2的x:2
t1的x:2
主線程中的x:2
t2的x:3
t1的x:3
主線程中的x:3
t2的x:4
t1的x:4
主線程中的x:4
t2的x:5
t1的x:5
主線程中的x:5
?
三個線程的順序,在這段代碼中我們是無法控制的,天知道誰先開始/誰先結(jié)束,反正都是"并行"處理,完全看CPU當時的心情? :)
問題:如果需求有變化,比如要求在主線程執(zhí)行到某個特定的位置(或時間點)時,才讓其它線程開始介入,該怎么做呢?(這種情況實際中很常見,比如某一項計算的入口參數(shù)依賴于另一項計算的結(jié)果,再比如我們計算月工資前,得先統(tǒng)計出員工當月考勤情況)
System.Threading命名空間下有一個ManualResetEvent類,可以做到這一點:
using?System.Threading;
namespace?ManualResetEventStudy
{
????class?ThreadClass
????{???????
????????static?ManualResetEvent?mre?=?new?ManualResetEvent(false);
????????static?void?t1()
????????{
????????????mre.WaitOne(1000);//等待1秒后,自行啟動
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("t1的x:"?+?x);
????????????}
????????}
????????static?void?t2()
????????{
????????????mre.WaitOne();//一直等待下去,直到有"人"調(diào)用mre.set()發(fā)出信號為止
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("t2的x:"?+?x);
????????????}
????????}
????????static?void?Main(string[]?args)
????????{
????????????Thread?thrd1?=?new?Thread(t1);
????????????thrd1.Start();
????????????Thread?thrd2?=?new?Thread(t2);
????????????thrd2.Start();
????????????for?(int?x?=?1;?x?<=?5;?x++)
????????????{
????????????????Thread.Sleep(500);
????????????????Console.WriteLine("主線程中的x:"?+?x);
????????????????if?(x?==?3)?
????????????????{
????????????????????mre.Set();//通知所有等待的線程:“同志們,可以動啦”:)
????????????????}
????????????}
????????????Console.Read();
????????}????????
????}
}
?t1方法中,我們用 mre.WaitOne(1000);讓調(diào)用該方法的線程先等候1秒,t2方法中,我們用mre.WaitOne()無限等候,然后主線程中計數(shù)到3的時候,手動調(diào)用mre.Set()方法喚醒所有等候中的線程,運行結(jié)果類似下面這樣:
主線程中的x:1
主線程中的x:2
t1的x:1
主線程中的x:3
t1的x:2
t2的x:1
主線程中的x:4
t1的x:3
主線程中的x:5
t2的x:2
t1的x:4
t2的x:3
t1的x:5
t2的x:4
t2的x:5
?
?
?
總結(jié)
以上是生活随笔為你收集整理的多线程中的ManualResetEvent的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现程序间的数据传递
- 下一篇: MOSS中对列表的一些操作(创建,查询等