详解 ManualResetEvent(转)

详解 ManualResetEvent(转)原文:http://www.cnblogs.com/li-peng/p/3291306.html今天详细说一下ManualResetEvent它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用Reset以将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
);

执行结果

 详解 ManualResetEvent(转)

当初始化为false时,为非终止状态

static 
ManualResetEvent _mre =
new 
ManualResetEvent(
false
);

执行结果为

详解 ManualResetEvent(转)

这样我们就能看出来

终止状态时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时执行结果和上边的一样会不停的执行

详解 ManualResetEvent(转)

初始化为false时执行到waitOne()时就阻塞线程不会再往下执行了

详解 ManualResetEvent(转)

接下来你可能就会想当在非终止状态时怎么让线程继续执行,怎么再让它停下来,这就要用了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(转)

 代码:ManualResetEventDemo.rar

转载于:https://www.cnblogs.com/wwwbdabc/p/10333569.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161178.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python2 nonlocal_Python nonlocal

    python2 nonlocal_Python nonlocalpython3:变量作用域及global,nonlocal的用法在Python程序中声明、改变、查找变量名时,都是在一个保存变量名的命名空间中进行中,此命名空间亦称为变量的作用域。python的作用域是静态的,在代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定.变量作用域之LENGBL=Local局部作用域E=…

    2025年9月20日
    14
  • 程序化交易入门_程序化交易的经验之谈

    程序化交易入门_程序化交易的经验之谈这里会分享最新的个人新文章及转载不错的程序化交易文章!![在这里插入图片描述](https://img-blog.csdnimg.cn/20190520205748924.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpc2h1aW…

    2022年10月8日
    2
  • Vue中使用animate.css「建议收藏」

    Vue中使用animate.css「建议收藏」最近把公司官网项目依赖进行了升级,里面用到了animate.css。目前版本4.1.0。目前4.x版本相比之前3.x的breakingchange如下:Animate.cssv4broughtsomeimprovements,improvedanimations,andnewanimations,whichmakesitworthupgrading.Butitalsocomeswithabreakingchange:wehaveaddedpref

    2022年7月14日
    20
  • VMware安装centos7(电动卷闸门安装方法及步骤)

    原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool&utm_medium=referral本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下1.软硬件准备软件:推荐使用VMwear,我用的是VMwear12镜像:CentOS7,如…

    2022年4月12日
    46
  • vue onerror 用法

    vue onerror 用法在 img 标签上使用 onerror 后面跟着 onerror 的图片路径变量 defaultImg 在 data 中 定义图片路径 写法为 defaultImg this src require assets img default jpg 完整代码如下 template template

    2025年12月9日
    7
  • Velocity语法大全

    Velocity语法大全一、基本语法 1、”#”用来标识Velocity的脚本语句,包括#set、#if、#else、#end、#foreach、#end、#iinclude、#parse、#macro等; 如: #if($info.imgs) <imgsrc=”$info.imgs”border=0> #else <imgsrc=”noPhoto.jpg”> #end2、”$”用来标识一个对象(或理解为…

    2022年7月14日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号