ManualResetEvent的使用与介绍
它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
上面是它的功能描述,你可能会有点晕。我会用代码一点一点解释它,看完我写的这些内容,你自己运行一下代码你就会明白它的功能
我们从初始化来开始讲
可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。
我用代码 让大家看一下什么是终止状态和非终止状态
先看一下代码
class Program { static ManualResetEvent _mre = new ManualResetEvent( false ); static void Main( string [] args) { Thread[] _threads = new Thread[3]; for ( int i = 0; i < _threads.Count(); i++) { _threads[i] = new Thread(ThreadRun); _threads[i].Start(); } } static void ThreadRun() { int _threadID = 0; while ( true ) { _mre.WaitOne(); _threadID = Thread.CurrentThread.ManagedThreadId; Console.WriteLine( "current Tread is " + _threadID); Thread.Sleep(TimeSpan.FromSeconds(2)); } } } |
当初始化为true时,为终止状态
static ManualResetEvent _mre = new ManualResetEvent( true ); |
执行结果
当初始化为false时,为非终止状态
static ManualResetEvent _mre = new ManualResetEvent( false ); |
执行结果为
这样我们就能看出来
终止状态时WaitOne()允许线程访问下边的语句
非终止状态时WaitOne()阻塞线程,不允许线程访问下边的语句
我们也可以把WaitOne()放在方法最下边
static void ThreadRun() { int _threadID = 0; while ( true ) { _threadID = Thread.CurrentThread.ManagedThreadId; Console.WriteLine( "current Tread is " + _threadID); Thread.Sleep(TimeSpan.FromSeconds(2)); _mre.WaitOne(); } } |
当初始化为true时执行结果和上边的一样会不停的执行
初始化为false时执行到waitOne()时就阻塞线程不会再往下执行了
接下来你可能就会想当在非终止状态时怎么让线程继续执行,怎么再让它停下来,这就要用了set()和Reset()方法了
把非终止状态改为终止状态用Set()方法
把终止状态改为非终止状态用Reset()方法
我用用代码来实现它们只要把我们上 边的代码做一下改动
class Program { static ManualResetEvent _mre = new ManualResetEvent( false ); static void Main( string [] args) { Console.WriteLine( "输入1为Set() 开始运行" ); Console.WriteLine( "输入2为Reset() 暂停运行" ); Thread[] _threads = new Thread[3]; for ( int i = 0; i < _threads.Count(); i++) { _threads[i] = new Thread(ThreadRun); _threads[i].Start(); } while ( true ) { switch (Console.ReadLine()) { case "1" : _mre.Set(); Console.WriteLine( "开始运行" ); break ; case "2" : _mre.Reset(); Console.WriteLine( "暂停运行" ); break ; default : break ; } } } static void ThreadRun() { int _threadID = 0; while ( true ) { _threadID = Thread.CurrentThread.ManagedThreadId; Console.WriteLine( "current Tread is " + _threadID); Thread.Sleep(TimeSpan.FromSeconds(2)); _mre.WaitOne(); } } } |
当输入1 时会调用 Set()方法 ManualResetEvent 处于终止状态会WaitOne不会阻塞线程会一直运行下去
当输入2时会调用 Reser()方法ManualResetEvent处于非终止状态WaitOne会阻塞线程直到再调用 Set()方法
看一下执行结果吧
ManualResetEvent的使用与介绍的更多相关文章
- 线程同步 –Mutex和Semaphore
上一篇介绍了同步事件EventWaitHandle,以及它的两个子类型AutoResetEvent和ManualResetEvent.下面接着介绍WaitHandle的另外两个子类型Mutex和Sem ...
- C# ManualResetEvent 的方法介绍
名称 说明 1. Close 在派生类中被重写时,释放由当前 WaitHandle 持有的所有资源. (继承自 WaitHandle.)在XNA Framework中,此成员由 Close() ...
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...
- .NET多线程总结和实例介绍
摘要:.Net提供了许多多线程编程工具,可能是因为太多了,所以掌握起来总是有一些头疼,我在这里讲讲我总结的一些多线程编程的经验,希望对大家有帮助. 1.多线程的总结 不需要传递参数,也不需要返回参数 ...
- C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent
最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- C# 使用ManualResetEvent 进行线程同步
上一篇我们介绍了AutoResetEvent,这一篇我们来看下ManualResetEvent ,顾名思义ManualResetEvent 为手动重置事件. AutoResetEvent和Manua ...
- C#多线程的介绍(园子里比较全的一篇)
一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...
- 线程同步(AutoResetEvent与ManualResetEvent)
前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...
随机推荐
- HDU-3790 最短路径问题
最短路径问题 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- 在net安装程序中部署oracle客户端全攻略
在net安装程序中部署oracle客户端全攻略 主要的是要做三件工作: 打包文件,写注册表,注册环境变量说明:我的oracle版本为9, 在2000 advanced server 上测试通过,可以正 ...
- rails第一次做项目
最近这几天一直都是在做rails的入门,也就是熟悉rails的增.删.改.查操作,做到rails的入门.这几天的熟悉,只是对于操作的熟悉,对于rails语言的机制还有很多不是很熟悉.昨天接手第一个真正 ...
- UVA 11802 All Your Bases Belong to Us
题意:这个题题意个人觉得蛮难懂的....意思就是求,把十进制下的n!转化成m进制,末位有且仅有k个连续的0.告诉n和k,求满足题意的m有多少个. 1<= k <= 10^15,n < ...
- [html][css]让文字在div中居中的方法[转]
转至:http://dreamweaver.abang.com/od/divcss/a/vertical-align.htm 一.行高(line-height)法 如果要垂直居中的只有一行或几个文字, ...
- 记录:Ubuntu下配置java
使用的Ubuntu版本为:Ubunyu Kylin 14.04 >>下载JDK 网页链接:http://www.oracle.com/technetwork/java/javase/dow ...
- 圣诞节来了,雪花纷飞的CSS3动画,还不首页用起来
圣诞节来了,冬天来了,怎么可以没有雪花纷飞效果,昨天下班前折腾了一会儿,弄了个雪花纷飞的实例,有兴趣的可以交流分享下. 原文链接:http://www.html5think.com/article/i ...
- JavaBean以及MVC模式
JavaBean, 咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提供无参数的构造方法 ...
- 在Excel中创建和使用ServerDocument
ServerDocument是微软提供的一种读取Word或Excel文档级应用中CachedData的工具.本示例将向你展示如何使用用ServerDocument. 1. 创建文档级应用 打 ...
- PAT---1001. A+B Format (20)
#include<stdio.h> int main(){ //定义要读入的两个整数 int a,b; //定义好放拆项用的数组 ]; //读入两个整数 scanf("%d%d& ...