详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html
今天详细说一下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(转)的更多相关文章
- 黄聪:详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html 今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程 ...
- 详解 ManualResetEvent
今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源 当一个线程开始一个活动(此活动必须完成后,其他线程 ...
- ManualResetEvent详解
原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html 1. 源码下载: 下载地址:http://files. ...
- .NET多线程同步方法详解
.NET多线程同步方法详解(一):自由锁(InterLocked) .NET多线程同步方法详解(二):互斥锁(lock) NET多线程同步方法详解(三):读写锁(ReadWriteLock) .NET ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
随机推荐
- Python爬虫加速神器的小试
大名鼎鼎的aiohttp,相信如果你学习Python或者爬虫的时候,肯定听说过这个东西.没听过也不要紧,今天看完文章,只要记住,aiohttp这个东西,在写爬虫的时候,很牛逼就行了. aiohttp ...
- appium入门(1)__ appium介绍
摘自:http://www.testclass.net/appium/appium-base-summary/ 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android ...
- LED客显的类
using System; using System.IO.Ports; namespace Common { public class LedHelper { ; private static st ...
- 10.0-uC/OS-III任务管理
1.实时应用中一般将工作拆分为多个任务,每个任务都需要是可靠的.任务(也叫做线程)是简单的程序.单CPU中,在任何时刻只能是一个任务被执行. 2.uC/OS-III支持多任务且对任务数量没有限制, 任 ...
- python 遇到的问题及解答
1.使用pip安装python 模块 打开cmd 输入pip install *,如pip install numpy 等待安装(如下) C:\WINDOWS\System32>pip i ...
- python-面向对象-02_类和对象
类和对象 目标 类和对象的概念 类和对象的关系 类的设计 01. 类和对象的概念 类 和 对象 是 面向对象编程的 两个 核心概念 1.1 类 类 是对一群具有 相同 特征 或者 行为 的事物的一个统 ...
- state访问状态对象
状态对象赋值给内部对象,也就是把stroe.js中的值,赋值给我们模板里data中的值.我们有三种赋值方式: 1.通过computed的计算属性直接赋值 Count.vue {count} <s ...
- The each() function is deprecated报错的解决方法
下午ytkah安装程序时出现了如下提示,意思是each函数过时了,可能跟php版本有关,因为今天早上刚把LAMP组件升级了,php升到7.2了,切换成php 7.1版本,提示消失了,可见PHP 7.2 ...
- 开发uniapp必备
开发工具http://quickapp.dcloud.io/ 开发手册 http://uniapp.dcloud.io/api/README(2018-7-27 发布) 调试环境http://ask. ...
- python 内置方法expandtabs 把字符串格式化成列表输出
#!/usr/bin/python3 # -*- coding: utf-8 -*- test = "username\tmail\tage\nzhangsen\tzhangsen@qq.c ...