多线程中的ManualResetEvent
先來看一下簡單的多線程控制臺(tái)程序:
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)建了二個(gè)線程,分別調(diào)用方法t1與t2,再加上主線程本身,一并有三個(gè)線程,運(yùn)行后,三個(gè)線程都在計(jì)數(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
?
三個(gè)線程的順序,在這段代碼中我們是無法控制的,天知道誰先開始/誰先結(jié)束,反正都是"并行"處理,完全看CPU當(dāng)時(shí)的心情? :)
問題:如果需求有變化,比如要求在主線程執(zhí)行到某個(gè)特定的位置(或時(shí)間點(diǎn))時(shí),才讓其它線程開始介入,該怎么做呢?(這種情況實(shí)際中很常見,比如某一項(xiàng)計(jì)算的入口參數(shù)依賴于另一項(xiàng)計(jì)算的結(jié)果,再比如我們計(jì)算月工資前,得先統(tǒng)計(jì)出員工當(dāng)月考勤情況)
System.Threading命名空間下有一個(gè)ManualResetEvent類,可以做到這一點(diǎn):
using?System.Threading;
namespace?ManualResetEventStudy
{
????class?ThreadClass
????{???????
????????static?ManualResetEvent?mre?=?new?ManualResetEvent(false);
????????static?void?t1()
????????{
????????????mre.WaitOne(1000);//等待1秒后,自行啟動(dòng)
????????????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ā)出信號(hào)為止
????????????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();//通知所有等待的線程:“同志們,可以動(dòng)啦”:)
????????????????}
????????????}
????????????Console.Read();
????????}????????
????}
}
?t1方法中,我們用 mre.WaitOne(1000);讓調(diào)用該方法的線程先等候1秒,t2方法中,我們用mre.WaitOne()無限等候,然后主線程中計(jì)數(shù)到3的時(shí)候,手動(dòng)調(diào)用mre.Set()方法喚醒所有等候中的線程,運(yùn)行結(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中对列表的一些操作(创建,查询等