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

浙公网安备 33010602011771号