zoukankan      html  css  js  c++  java
  • 浅谈AutoResetEvent的用法

    using System;
    using System.Threading;

    namespace AutoResetEvent_Examples
    {
        class MyMainClass
        {
            //初始的时候是没有信号的,这里的意思是指参数false
            const int numIterations = 100; //重复次数设置多少都无所谓,为让大家看清楚设置了100
            static AutoResetEvent myResetEvent = new AutoResetEvent(false);
            static int number;

            static void Main()
            {
                //创建并开始一个线程。
                Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc));
                myReaderThread.Name = "ReaderThread";
                myReaderThread.Start();

                for (int i = 1; i <= numIterations; i++)
                {
                    Console.WriteLine("Writer thread writing value: {0}", i);
                    number = i;

                    //发信号,说明值已经被写进去了。这里的意思是说Set是一个发信号的方法。
                   myResetEvent.Set();

                    //让每次循环当中有些间隔,没有其他作用,可以注释掉
                  Thread.Sleep(1000);
                }

                //终止阅读线程。

                myReaderThread.Abort();
            }

            static void MyReadThreadProc()
            {
                while (true)
                {
                    //在数据被作者写入之前不会被读者读取
                    //在上次读取之前至少有一次。
                    myResetEvent.WaitOne();
                    Console.WriteLine("{0} reading value: {1}", Thread.CurrentThread.Name, number);
                }
            }
        }
    }

    下面我会配图进行说明,便于大家更好的理解,AutoResetEvent在使用前必须通过是例化进行初始,如:
    AutoResetEvent myResetEvent = new AutoResetEvent(false);
    MSDN中讲到,若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false
    如过设置true,也就是说这个Event回自动Reset,那么myResetEvent.WaitOne()就能够在程序一启动就获得运行权;就相当于一启动程序就自动运行了一次myResetEven.Set();
    反之,就要等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;

    这里我做个实验给大家看,大家会看到,在设置为true的时候会首先看到ReaderThread reading value运行,然后才是Writer thread wrirting出现:

     如设置为false就会发现,先出现的是写的信息:

     相信大家应该明白它的初始的意义了.
    上面我们提到了myResetEven.Set(),这个方法是做什么的呢,其实简单点说就相当于一个开关,如果没有执行set()方法,下面的waitOne()就等不到让它执行的通知,这样一来waitOne后面的语句也不会执行了,waitone()就会傻等下去...一直等到set()执行后才会执行它后面的操作,

    我们再次做个实验,把myResetEven.Set()注释掉,结果应该是读的信息永远不会出现,如图:

     也就是说,如果 AutoResetEvent.Set()上面的线程完全被执行,AutoResetEvent.WaitOne()控制下的线程才被执行.很简单吧!!
  • 相关阅读:
    571B. Minimization(Codeforces Round #317)
    java的死锁学习
    算法——大整数乘法
    从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
    软硬件之共生之道——一千零一夜的启发
    Java系列之JNDI
    the solution of CountNonDivisible by Codility
    qml
    日历日历日历
    项目总结——传说中的反射居然是这个样子
  • 原文地址:https://www.cnblogs.com/sjqq/p/8492794.html
Copyright © 2011-2022 走看看