ManualResetEvent 线程同步「建议收藏」

ManualResetEvent 线程同步「建议收藏」ManualResetEvent  ManualResetEvent用于线程同步,通知一个或多个线程某事件已经发生。通常用于一个线程执行的任务必须在其他线程的任务执行之前完成。ManualResetEvent状态分为两种:终止状态和非终止状态。当某一任务完成时,将ManualResetEvent设置为终止状态,这样其他等待的线程(一个或多个)将开始执行自己的任务。

大家好,又见面了,我是你们的朋友全栈君。

ManualResetEvent  

ManualResetEvent 用于线程同步,通知一个或多个线程某事件已经发生。通常用于一个线程执行的任务必须在其他线程的任务执行之前完成。

ManualResetEvent状态分为两种:终止状态和非终止状态。当某一任务完成时,将ManualResetEvent设置为终止状态,这样其他等待的线程(一个或多个)将开始执行自己的任务。

 

注意:一旦它被终止,它将保持终止状态,直到它被手动重置。

 

代码示例:

 

ManualResetEvent 线程同步「建议收藏」
代码

    
    
    
class Program
{
static void Main( string [] args)
{
Caclultae calc
= new Caclultae();
Console.WriteLine(
" Result={0} " ,calc.result( 234 ).ToString());

Console.Read();
}
}
class Caclultae
{
double baseNum,firNum,secNum,thdNum;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;
Random Generator;
public Caclultae()
{
autoEvents
= new AutoResetEvent[]
{
new AutoResetEvent( false ),
new AutoResetEvent( false ),
new AutoResetEvent( false )
};
manualEvent
= new ManualResetEvent( false );
}
void CalBase( object stateInfo)
{
baseNum
= Generator.NextDouble();
Console.WriteLine(
" BaseNum is Ok " );
manualEvent.Set();
}
void CalFirst( object stateInfo)
{
double preCalc = Generator.NextDouble();

manualEvent.WaitOne();
Console.WriteLine(
" FirstNum begins to Calculate " );
firNum
= preCalc * baseNum * Generator.NextDouble();

autoEvents[
0 ].Set();
Console.WriteLine(
" FirstNum Calculates successfully " );
}
void CalSec( object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
" SecNum begins to Calculate " );
secNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
1 ].Set();
Console.WriteLine(
" SecNum Calculates successfully " );
}
void CalThird( object stateInfo)
{
double preCalc = Generator.NextDouble();
manualEvent.WaitOne();
Console.WriteLine(
" ThrdNum begins to Calculate " );
thdNum
= preCalc * baseNum * Generator.NextDouble();
autoEvents[
2 ].Set();
Console.WriteLine(
" ThrdNum Calculates successfully " );
}
public double result( int seed)
{
Generator
= new Random(seed);
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalFirst));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalSec));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalThird));
WaitHandle.WaitAll(autoEvents);
manualEvent.Reset();
return firNum + secNum + thdNum;
}

}

 

代码中,我们可以看到,CalFirst,CalSec,CalThird都在等待CalBase执行完成。当CalBase计算出BaseNum的结果之后,将ManualResetEvent变量设置为终止状态,通知其他三个任务,可以执行他们自己的任务了。

执行结果:

1).执行一次的结果:

ManualResetEvent 线程同步「建议收藏」

 

2). 再次执行的结果:

ManualResetEvent 线程同步「建议收藏」

 

从两次执行结果中看出,CalFirst、CalSec、CalThird的执行顺序是不一定的,也就是说 这三个的地位是相同的,都在等待CalBase执行成功,从而执行自己的任务。这也验证了 ManualResetEvent的作用,用于通知一个或多个线程某个事件发生。

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

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

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

相关推荐

  • Ubuntu Edgy Eft complete sources.list (repository list file) (完整的ubuntu 源列表) Ubuntu Edgy Eft complete sources.list (repository

    Ubuntu Edgy Eft complete sources.list (repository list file) (完整的ubuntu 源列表) Ubuntu Edgy Eft complete sources.list (repository

    2021年4月28日
  • but六种用法_比较级的用法和句型

    but六种用法_比较级的用法和句型1.EXPLAIN简介使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。➤通过EXPLAIN,我们可以分析出以下结果:表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询➤使用方式如下:EXPLAIN+SQL语…

    2022年10月18日
  • WinRAR 去除广告弹窗,简单4步亲测有效!

    WinRAR 去除广告弹窗,简单4步亲测有效!非常实用,亲测有效!下载这款破解小可爱软件:ResourceHacker软件很小,不要闲麻烦下载后打开WinRAR.exe,点击字符串表:修改第80:2052删除1272,然后保存。再次使用就没弹窗了,舒服了!参考:https://www.hack520.com/173.html…

    2022年5月20日
  • 基于51单片机控制步进电机正反转「建议收藏」

    基于51单片机控制步进电机正反转「建议收藏」基于51单片机控制步进电机正反转此次采用uln2003模块来链接步进电机;##步进电机工作原理步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。步进电动机的结构形式和分类方法较多,一般按励磁方式分为磁阻式、永磁式和混磁式三种;按相数可分为单相、两相、三相和多相等形式。因此我们可以控制单片机I/O口的电平来控制步进电机,此次设计中采用四相单拍工作方式,在这种工作方式下,A、

    2022年5月31日
  • 如何确定pip安装成功,如何确定pygame安装成功

    如何确定pip安装成功,如何确定pygame安装成功一、如何确定pip安装成功?方法:在终端窗口中,输入piplist,能看到版本信息。(前提是要先将pip加入到环境变量中)二、如何确定pygame安装成功?方法,在终端窗口中,输入python-mpygame.examples.aliens,如果安装成功,会弹出一个游戏画面。示例游戏画面:…

    2022年5月23日
  • android 定时器封装

    android 定时器封装好用的定时器封装工具类,谁用谁知道,代码仅供学习参考。importjava.util.HashMap;importjava.util.LinkedList;importjava.util.Map;importjava.util.Queue;importcom.tcl.framework.log.NLog;importandroid.os.Ha

    2022年7月25日

发表回复

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

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