黄聪:详解 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
今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源 当一个线程开始一个活动(此活动必须完成后,其他线程 ...
- 详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html 今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程 ...
- ManualResetEvent详解
原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html 1. 源码下载: 下载地址:http://files. ...
- [转]CSS vertical-align属性详解 作者:黄映焜
CSS vertical-align属性详解 posted @ 2014-08-26 17:44 黄映焜 前言:关于vertical-align属性. 实践出真知. 垂直居中. 第二种用法. ...
- 黄聪:《跟黄聪学WordPress主题开发》
又一个作品完成!<跟黄聪学Wordpress主题开发>,国内最好的Wordpress主题模版开发视频教程!! 目录预览: WordPress官方源文件层式结构讲解 WordPress数据库 ...
- 黄聪:wordpress教程
又一个作品完成!<跟黄聪学Wordpress主题开发>,国内最好的Wordpress主题模版开发视频教程!! 目录预览: WordPress官方源文件层式结构讲解 WordPress数据库 ...
- Mysql 操作命令 详解
目的:1. 掌握mysql的安装,建库.建表.表的三种基本操作.查询.多表查询.数据库的备份与恢复2. MYSQL 服务器的简单维护3. mysql+apache+php的环境搭建 一.如何安装mys ...
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...
- net user命令集合详解
net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...
随机推荐
- JS的学习体会与分享
最近在学习js这门计算机网络的新知识.相比与之前所学习的html和css这两门编程语言,js 还是有很多的不同之处,它相比于前两门知识还是有一定的难度和逻辑性的.今天跟大家分享一篇文章,希望能从中获得 ...
- C#窗体 WinForm 进程,线程
一.进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using Sys ...
- 项目二(业务GO)——跨域上传图片(请求接口)
之前,就听过“跨域上传”图片的问题,只是疏于研究,也就一再搁置,直至今天再次遇见这个不能避免的“坑”,才不得不思考一下,怎么“跨域上传”图片或者文件? 问题来源: 何为“跨域”? ——就是给你一个接口 ...
- Eclipse 常用用法
搞了很多年的.NET, 最近开始搞Eclipse. 刚开始使用 Eclipse, 发现 Eclipser 远没有Visual Stuido 强大. 所以先把Eclipse常用的用法总结 ...
- CodeForces #367 div2 D Trie
题目链接:Vasiliy's Multiset 题意:这里有一个set容器,有三种操作,+ num, - num, ? num,分别代表往容器里加上num,或者拿走num,或着从容器里找一个数temp ...
- fifo write
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...
- Using Interface Builder记录
1.interface builder的作用主要是用来设计视图,文件的拓展名诶.storyboard或者.xib :这两文件的区别是,.xib文件只能设计一个视图控制器,也就只能显示一个视图,.sto ...
- CSS特性: 继承 和 层叠
在css中也存在着继承关系,与面向对象的编程语言不同,css的继承很简单,而且主要指的是在CSS盒模型中,外围的盒子的样式会被内部所包含的盒子所继承.具体来了解一下. HTML元素之间存在一个”树型“ ...
- HDU 2089 不要62
也是简单的数位dp. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- C#数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合.在任何问题中,数据元素之间都不是孤立的,而是存在着一定的关系,这种关系称为结构(Structure).根据数据元素之间关系的不同特性,通常有 ...