博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoResetEvent and ManualResetEvent
阅读量:5900 次
发布时间:2019-06-19

本文共 2610 字,大约阅读时间需要 8 分钟。

AutoResetEvent and ManualResetEvent 的初始化

两者初始化时可以接受一个 bool 类型值作为构造函数的参数.

false: 无信号 (非终止状态)

true:  有信号 (终止状态)

/// 
/// 注释为程序执行流
/// 
public partial class Form1 : Form
{
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
 
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(this.Fun1);
t1.Start();
 
// 阻塞当前线程,转而执行t1线程
Thread.Sleep(3000);
 
// 3秒后给调用set()给出信号,当前线程后面没有代码了,程序转而执行t1线程
autoResetEvent.Set();
}
 
void Fun1()
{
// 由于信号初始化时的状态时false,waitone()会阻塞当前线程,等待信号
autoResetEvent.WaitOne();
MessageBox.Show("t1 step1 end!");
}
 
// 结论
// 此程序3秒后弹出 "t1 step1 end!"
// 如果初始化 autoResetEvent 时使用 true 参数,程序会立刻弹出 "t1 step1 end!"
// 在有信号的状态下,.WaitOne()不会起作用,切记!
}

 

AutoResetEvent and ManualResetEvent 的区别:

public partial class Form1 : Form
{
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
//ManualResetEvent autoResetEvent = new ManualResetEvent(false);
 
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(this.Fun1);
t1.Start();
Thread t2 = new Thread(this.Fun2);
t2.Start();
Thread.Sleep(3000);
autoResetEvent.Set();
}
 
void Fun1()
{
autoResetEvent.WaitOne();
MessageBox.Show("t1 step1 end!");
}
 
void Fun2()
{
autoResetEvent.WaitOne();
MessageBox.Show("t2 step1 end!");
}
 
// 结论1
// 此程序3秒后,要么弹出 "t1 step1 end!",要么弹出 "t2 step1 end!"
// 也就是说,其中有一个线程是永远也等不到信号的
 
 
// 结论2
// 如果交换注释行,则会同时弹出 "t1 step1 end!" 和 "t2 step1 end!"
// AutoResetEvent 只会给一个线程发送信号
// ManualResetEvent 会给多个线程发送信号
}

ManualResetEvent 的 Set() 与 Reset()

public partial class Form1 : Form
{
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
 
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(this.Fun1);
t1.Start();
Thread t2 = new Thread(this.Fun2);
t2.Start();
Thread.Sleep(3000);
manualResetEvent.Set();
//autoResetEvent.Reset();
}
 
void Fun1()
{
manualResetEvent.WaitOne();
MessageBox.Show("t1 step1 end!");
 
// 睡1秒,等待主线程的Reset()
Thread.Sleep(1000);
manualResetEvent.WaitOne();
MessageBox.Show("t1 step2 end!");
}
 
void Fun2()
{
manualResetEvent.WaitOne();
MessageBox.Show("t2 step1 end!");
 
// 睡1秒,等待主线程的Reset()
Thread.Sleep(1000);
manualResetEvent.WaitOne();
MessageBox.Show("t2 step2 end!");
}
 
// 结论1
// 程序3秒后会弹出 "t1 step1 end!" 和 "t2 step1 end!"
// 接着1秒后会弹出 "t1 step2 end!" 和 "t2 step2 end!"
// 由于 ManualResetEvent 在Set()后,并不会自动把线程状态变为false,因此后2步的waitone()不会起作用
// 如果取消注释行,永远也不会弹出 "t1 step2 end!" 和 "t2 step2 end!",除非再次进行Set();
 
// 结论2
// AutoResetEvent在Set()后,会将线程状态自动置为false,ManualResetEvent在Set()后就变为ture了
// ManualResetEvent必须手动Reset()后才能变为false,这也就是他们为什么一个是Auto,一个是Manual
}

 

结论

这些信号灯是以自身的状态来控制所有的线程运行方式,同步,等待等等.

转载地址:http://mehsx.baihongyu.com/

你可能感兴趣的文章
Windows Server 笔记(六):Active Directory域服务:域控制器安装
查看>>
discuz X3登录流程分析
查看>>
上传图片预览
查看>>
程序设计的一些原理
查看>>
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
struts2+extjs
查看>>
Apache2.4.33安装无systemctl/service status/state显示
查看>>
Docker的系统资源限制及验证
查看>>
在大公司呆5年,你就废了
查看>>
mac mamp mysql no start servel
查看>>
Docker简易版:使用更少击键运行Redis,MongoDB
查看>>
laravel框架快速入门(一)
查看>>
c++ ios_base register_callback方法使用
查看>>
Java中为什么需要Object类,Object类为什么是所有类的父类
查看>>
angularjs-paste-upload
查看>>
RXjs相关
查看>>
linux基础命令 head
查看>>
objective c:import和include的区别, ""和<>区别
查看>>
spring SchedulerFactoryBean 没有创建 Scheduler的实现类bea
查看>>