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)
上一篇 2022年7月18日 下午2:46
下一篇 2022年7月18日 下午3:00


相关推荐

  • 读书 Android应用开发揭秘[通俗易懂]

    读书 Android应用开发揭秘[通俗易懂]一、Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成。二、特点:1、开放性2、应用程序无界限3、应用程序在平等的条件下创建4、应用程序可以轻松的嵌入网络5、应用程序可以并行运行。三、Android系统架构分为四层:应用层:java编写运行在虚拟机上的程序。应用框架层:编写应用时使用的API框架。系统运行库层:C/C++库Lin…

    2022年5月29日
    36
  • 高档名片设计:12款专业的名片设计欣赏

    高档名片设计:12款专业的名片设计欣赏名片作为陌生人之间建立联系的最便捷 最有效的工具 专业的名片设计可以给你的客户留下良好的第一印象 名片同时也是一个企业和个人最重要和最符合成本效益的营销工具之一 这个列表展示了 12 款专业的高档名片设计 一起欣赏 您可能感兴趣的相关文章 35 佳漂亮的迷你名片设计作品欣赏最新 70 佳很酷的名片设计作品欣赏创意无限 25 款非常酷的高档名片设计分享 35 套免费的国外 PSD 名片

    2026年3月20日
    3
  • 火山引擎发布豆包大模型 1.6,加速 Agent 大规模应用

    火山引擎发布豆包大模型 1.6,加速 Agent 大规模应用

    2026年3月12日
    1
  • 学习率衰减之余弦退火(CosineAnnealing)

    学习率衰减之余弦退火(CosineAnnealing)1引言当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型尽可能接近这一点,而余弦退火(Cosineannealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。在论文StochasticGradientDescentwithWarmRestarts中介绍主要介绍了带重启的随机梯度下降算法(SGDR),其

    2022年5月1日
    61
  • monit 监控_沃伦尚监控手机客户端

    monit 监控_沃伦尚监控手机客户端urlhttp://mmonit.com/monit/documentation/monit.htmlVersion5.12NAMESYNOPSISDESCRIPTIONWHATTOMONITOR?GENERALOPERATIONOptionsArguments…

    2025年6月6日
    5
  • 解释器模式-破解算术验证码

    解释器模式-破解算术验证码给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

    2022年6月1日
    45

发表回复

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

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