大家好,又見面了,我是你們的朋友全棧君。
class Program
{
static void Main(string[] args)
{
//注意:ManualResetEvent可以對所有進行等待的線程進行統一控制
//true-初始狀态為發出信号;false-初始狀态為未發出信号
ManualResetEvent mre = new ManualResetEvent(false);
//線程池開啟10個線程
for (int i = 0; i < 10; i++)
{
int k = i;
ThreadPool.QueueUserWorkItem(t =>
{
Console.WriteLine($"這是第{k+1}個線程,線程ID為{Thread.CurrentThread.ManagedThreadId}");
//等待信号,沒有信号的話不會執行後面的語句,因為初始狀态是false,是以後面的語句暫時不會執行
mre.WaitOne();
Console.WriteLine($"第{k+1}個線程獲得信号,線程ID為{Thread.CurrentThread.ManagedThreadId}");
});
}
Thread.Sleep(5000);
Console.WriteLine("\r\n 5秒後發出信号... \r\n");
//Set()方法:釋放信号,所有等待信号的線程都将獲得信号,開始執行WaitOne()後面的語句
mre.Set();
Console.ReadKey();
}
}
複制
執行結果如圖
可見,沒有信号時,WaitOne()後面的語句都不執行(被阻塞),當Set()釋放信号後,所有阻塞的線程都開始繼續執行。
釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/161165.html原文連結:https://javaforall.cn