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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 局域网、城域网、广域网、国际互联网(internet)

    局域网、城域网、广域网、国际互联网(internet)计算机网络按覆盖范围分类可分为局域网,城域网,广域网一、局域网: 1、地理分布范较小,一般为数百米至数公里。可覆盖一幢大楼、一所校园或一个企业、一个家庭。 2、数据传输速率高,一般为100Mbps,目前已出现速率高达1000Mbps的局域网。可交换各类数字和非数字(如语音、图象、视频等)信息。 3、误码率低,这是因为局域网通常采用短距离基带传输,可以使用高质量的传输媒体,从而…

    2022年10月18日
    0
  • Mac os 安装Python Pycharm 配置环境「建议收藏」

    Mac os 安装Python Pycharm 配置环境「建议收藏」  主要就是这三个库的安装   importrequestsfrombs4importBeautifulSoupimporttime我是PYthon小白,自己把程序运行出来在环境配置走了不少弯路。因为我还安装了一台Windows环境,中间交叉做了其他一些事情,所以思路没有那么清晰。但是刚刚终于成功抓了数据。代码和程序运行成功截图放在最后。先说说环境配置,我会尽量回忆。我安装的是…

    2022年8月28日
    0
  • linux重启tomcat进程,Linux系统重启tomcat服务的方法详解「建议收藏」

    Linux系统下tomcat服务的重启需要通过命令来解决。下面由学习啦小编为大家整理了Linux系统重启tomcat服务的方法详解,希望对大家有帮助!Linux系统重启tomcat服务的方法详解一在Linux系统下,重启Tomcat使用命令操作的!首先,进入Tomcat下的bin目录cd/usr/local/tomcat/bin使用Tomcat关闭命令./shutdown.sh查看Tomcat是…

    2022年4月7日
    88
  • python开发oa办公系统_python web开发框架

    python开发oa办公系统_python web开发框架https://www.odoo.com/zh_CN

    2022年10月28日
    0
  • 单片机p0=0xfe中0x是什么意思_c语言中&是什么符号,代表什么

    单片机p0=0xfe中0x是什么意思_c语言中&是什么符号,代表什么相信很多人对于0x80(单片机0x80什么意思)并不是非常的了解,因此小编在这里为您详解的讲解一下相关信息!0x80这是十六进制数,变成十进制数为-128,因为char型在C语言中范围为-128~127,并不是0乘以80,c语言中乘以用*,例如0*80,表示0乘以80。扩展资料:C语言是一.0x8110000000或00000001这是区分汉字编码的汉字编码区别于其他编码的标志就是汉字编码的最…

    2022年9月13日
    0
  • 基于Python的频谱分析(一)

    基于Python的频谱分析(一)

    2021年11月21日
    39

发表回复

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

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