详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html
今天详细说一下ManualResetEvent
它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源
当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
上面是它的功能描述,你可能会有点晕。我会用代码一点一点解释它,看完我写的这些内容,你自己运行一下代码你就会明白它的功能
源代码:ManualResetEventDemo.rar
我们从初始化来开始讲
可以通过将布尔值传递给构造函数来控制 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()方法
看一下执行结果吧
代码:ManualResetEventDemo.rar
转载于:https://www.cnblogs.com/wwwbdabc/p/10333569.html
详解 ManualResetEvent(转)相关推荐
- 黄聪:详解 ManualResetEvent(转)
原文:http://www.cnblogs.com/li-peng/p/3291306.html 今天详细说一下ManualResetEvent 它可以通知一个或多个正在等待的线程已发生事件,允许线程 ...
- ManualResetEvent详解
源码下载: 下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar Demo: 2. ManualResetEvent ...
- Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园
Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpking - 博客园 Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议 - Atpkin ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法
深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...
- CUDA之nvidia-smi命令详解---gpu
nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...
- Bert代码详解(一)重点详细
这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...
最新文章
- 咱们一起聊聊Zookeeper
- Spring.NET性能
- Windows Phone 7 MVVM模式通讯方式之实现Command
- java心得---java语言基础
- Linux学习之CentOS(五)--让我有些郁闷的mount命令
- servlet/filter/listener/interceptor区别与联系(转)
- 这个天气怎么就这么热啊,哪里还有心情写代码呀。
- linux 查看hive版本号,如何从命令提示符知道Hive和Hadoop版本?
- Spring Boot 核心配置文件,yml 语法规范、 多环境配置、配置文件加载顺序
- mysql与oracle存储过程_5分钟学会oracle与mysql存储过程insertinto
- CDH集群更换ip,主机名
- Scratch编程(十)扩展模块:视频侦测模块
- mysql在结果中添加总计一行_在MySQL结果的最后一行获取总计?
- AP 产品成本计算与传统成本计算
- XDOC云服务API(七)
- iOS超级签名违法么?
- 微软面试题:3,3,8,8,四个数字任意加减乘除使之最后等于24的编程解决方法
- 计算机桌面都有说明书,360桌面助手功能使用说明
- FPGA 面试经历分享
- JQuery 基础(1)—— 基本介绍、选择器、筛选器(选择器的一种)