ManualResetEvent和AutoResetEvent的区别

 class Program
    {
        /*
         *
         * ManualResetEvent都可以阻塞一个或多个线程,
         * 直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。
         * ManualResetEvent手动reset
         *  ManualResetEvent会给线程1和线程2都发送一个信号,
         *  
         * AutoResetEvent set后会自动reset
         * AutoResetEvent只会随机给其中一个发送信号。
         * 
         * 
         * 本质上AutoResetEvent.Set()方法相当于ManualResetEvent.Set()+ManualResetEvent.Reset();
         *   因此AutoResetEvent一次只能唤醒一个线程,其他线程还是堵塞
         */
        static ManualResetEvent mre = new ManualResetEvent(false);
        static AutoResetEvent are = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            Console.WriteLine("-----ManualResetEvent-----");
            Thread th1 = new Thread(new ThreadStart(MreThread1));
            Thread th2 = new Thread(new ThreadStart(MreThread2));
            th1.Start();
            th2.Start();
            Thread.Sleep(5000);
            mre.Set();
            Console.ReadKey();


            Console.WriteLine("-----再次调用时需要手动reset-----");

            mre.Reset();
            th1 = new Thread(new ThreadStart(MreThread1));
            th2 = new Thread(new ThreadStart(MreThread2));
            th1.Start();
            th2.Start();
            Thread.Sleep(5000);
            mre.Set();
            Console.ReadKey();


            Console.WriteLine("-----AutoResetEvent-----");
            th1 = new Thread(new ThreadStart(AreThread1));
            th2 = new Thread(new ThreadStart(AreThread2));
            th1.Start();
            th2.Start();
            Thread.Sleep(5000);
            are.Set();
            Console.ReadKey();
            //
            Console.WriteLine("-----再次调用时不需要手动reset-----");

            th1 = new Thread(new ThreadStart(AreThread1));
            th2 = new Thread(new ThreadStart(AreThread2));
            th1.Start();
            th2.Start();
            Thread.Sleep(5000);
            are.Set();
        }


        static void MreThread1()
        {
            Console.WriteLine("Thread1 wait single");
            mre.WaitOne();
            Console.WriteLine("Thread2single arrive");
        }

        static void MreThread2()
        {
            Console.WriteLine("Thread2 wait single");
            mre.WaitOne();
            Console.WriteLine("Thread2 single arrive");
        }


        static void AreThread1()
        {
            Console.WriteLine("Thread1 wait single");
            are.WaitOne();
            Console.WriteLine("Thread2single arrive");
        }

        static void AreThread2()
        {
            Console.WriteLine("Thread2 wait single");
            are.WaitOne();
            Console.WriteLine("Thread2 single arrive");
        }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

random_2011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值