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