多线程ManualResetEvent和AutoResetEvent

一:个人理解的定义:AutoResetEvent和ManualResetEvent都是类似一种开关控制器,定义的时候内存内置一个布尔值,false(阻塞线程),true(不阻塞线程),通过reset,set方法控制。

  就类似一个红绿灯,设false就是红灯,线程跑到wait就停下,而true就是绿灯,线程不停。

 

二:区别:

  AutoResetEvent每次set只唤醒一个线程,并且不需要手动reset,其它线程还是保持wait

  ManualResetEvent会唤醒所有的线程,且需要手动reset,类似于开闸放水,原先等着的一下都出去了,要手动reset回来,后面的线程才会继续阻塞。

三:之前做到一道Lecode例题,可以很好的运用到他们,原题如下:  

  1.三个不同的线程A,B,C公用一个Foo实例

public class foo

{

  //A线程调用:

  public void first(){print("first");}

  //B线程调用:

  public void second(){print("second");}

  //C线程调用:

  public void third(){print("third");}

}

  请设计程序,确保second方法在first方法后执行,third方法在second方法后调用

输入:nums = [1,2,3]
输出:"firstsecondthird"
输入:nums = [1,3,2]
输出:"firstsecondthird"

2.解题demo:

using System.Threading;
public class Foo 
{
    private AutoResetEvent _second = new AutoResetEvent(false);
    private AutoResetEvent _three = new AutoResetEvent(false);
    public Foo()
    {

    }

    public void First(Action printFirst)
     {
        printFirst();
        _second.Set();
    }

    public void Second(Action printSecond)
     {
        _second.WaitOne();
        printSecond();
        _three.Set();
    }

    public void Third(Action printThird) 
    {
        _three.WaitOne();
        printThird();
    }
}


posted @ 2023-03-31 16:46  曲处通幽静  阅读(34)  评论(0)    收藏  举报