日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程中的ManualResetEvent

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程中的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里,創建了二個線程,分別調用方法t1與t2,再加上主線程本身,一并有三個線程,運行后,三個線程都在計數輸出,結果類似如下:

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

?

三個線程的順序,在這段代碼中我們是無法控制的,天知道誰先開始/誰先結束,反正都是"并行"處理,完全看CPU當時的心情? :)

問題:如果需求有變化,比如要求在主線程執行到某個特定的位置(或時間點)時,才讓其它線程開始介入,該怎么做呢?(這種情況實際中很常見,比如某一項計算的入口參數依賴于另一項計算的結果,再比如我們計算月工資前,得先統計出員工當月考勤情況)

System.Threading命名空間下有一個ManualResetEvent類,可以做到這一點:

using?System;
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();//一直等待下去,直到有"人"調用mre.set()發出信號為止
????????????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);讓調用該方法的線程先等候1秒,t2方法中,我們用mre.WaitOne()無限等候,然后主線程中計數到3的時候,手動調用mre.Set()方法喚醒所有等候中的線程,運行結果類似下面這樣:

主線程中的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

?

?

?

總結

以上是生活随笔為你收集整理的多线程中的ManualResetEvent的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。