天天看點

ManualResetEvent的了解和使用[通俗易懂]

大家好,又見面了,我是你們的朋友全棧君。

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();
        }
    }           

複制

執行結果如圖

ManualResetEvent的了解和使用[通俗易懂]

可見,沒有信号時,WaitOne()後面的語句都不執行(被阻塞),當Set()釋放信号後,所有阻塞的線程都開始繼續執行。

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/161165.html原文連結:https://javaforall.cn