详解 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




本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/p/5633456.html,如需转载请自行联系原作者

相关文章
|
文字识别 计算机视觉 Python
python opencv识别并提取表格数据
使用opencv、PaddleOCR 识别表格并提取表格数据
3155 0
python opencv识别并提取表格数据
|
存储
ASCII码可以表示汉字吗?
ASCII码可以表示汉字吗?
5339 0
WinForm通用自动更新器AutoUpdater项目实战
一、项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能。因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能。
1755 0
|
安全 Linux 网络安全
VS Code通过跳板机连接服务器进行远程代码开发
VS Code通过跳板机连接服务器进行远程代码开发
3359 0
VS Code通过跳板机连接服务器进行远程代码开发
|
机器学习/深度学习 人工智能 自然语言处理
企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析
DeepSeek R1 是一款先进的大规模深度学习模型,专为自然语言处理等复杂任务设计。它具备高效的架构、强大的泛化能力和优化的参数管理,适用于文本生成、智能问答、代码生成和数据分析等领域。阿里云平台提供了高性能计算资源、合规与数据安全、低延迟覆盖和成本效益等优势,支持用户便捷部署和调用 DeepSeek R1 模型,确保快速响应和稳定服务。通过阿里云百炼模型服务,用户可以轻松体验满血版 DeepSeek R1,并享受免费试用和灵活的API调用方式。
809 12
|
机器学习/深度学习 人工智能 自然语言处理
PaddleSpeech:百度飞桨开源语音处理神器,识别合成翻译全搞定
PaddleSpeech是百度飞桨团队推出的开源语音处理工具包,集成语音识别、合成、翻译等核心技术,基于PaddlePaddle框架提供高性能解决方案。
1195 18
PaddleSpeech:百度飞桨开源语音处理神器,识别合成翻译全搞定
|
传感器 Go 智能硬件
使用Golang开发硬件驱动
使用Golang开发硬件驱动
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
568 3
|
设计模式 存储 开发者
如何在业务代码中优雅地使用责任链模式
责任链模式是一种行为设计模式,本文从责任链模式的定义到其优雅之处、合适的应用场景、应用示例、实现步骤等方面详细讲述了如何在业务代码中优雅的使用责任链模式。
|
API
【threejs教程】threejs中的边边角角:几何体详解
【8月更文挑战第6天】threejs中的几何体详解
712 4
【threejs教程】threejs中的边边角角:几何体详解