多執行緒中的ManualResetEvent
先來看一下簡單的多執行緒控制檯程式:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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類,可以做到這一點:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-620626/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 多執行緒中的鎖系統(三)-WaitHandle、AutoResetEvent、ManualResetEvent執行緒AI
- ManualResetEvent實現執行緒的暫停與恢復執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- C#執行緒同步手動重置事件——ManualResetEventC#執行緒事件
- Java中的多執行緒Java執行緒
- RxJava 中的多執行緒RxJava執行緒
- Qt 中的多執行緒QT執行緒
- Java中多執行緒的案例Java執行緒
- ArcGISEngine中的多執行緒使用執行緒
- Java 程式中的多執行緒Java執行緒
- Android中的多程式、多執行緒Android執行緒
- Python中的多工:多執行緒Python執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- Android《多執行緒-中》Android執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 多執行緒-多執行緒常見的面試題執行緒面試題
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- iOS 開發中的多執行緒iOS執行緒
- JSRE中的多工與多執行緒JS執行緒
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- VC多執行緒 C++ 多執行緒執行緒C++
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 多執行緒中不用sleep(),行嗎?執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多執行緒-程式和執行緒的概述執行緒
- 多執行緒之初識執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒