zoukankan      html  css  js  c++  java
  • Thread系列——AutoResetEvent

    AutoResetEvent也是一个同步对象,它用于对资源的独占访问。

    当AutoResetEvent处于终止状态时,如果存在等待的线程,则在该线程执行后,AutoResetEvent变量将自动变为非终止状态。

    代码示例:

    代码
    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;
    }

    }

    代码中,我们关注AutoResetEvent同步对象。从代码中我们可以看到 CalFirst、CalSec、CalThird方法中 都有一句AutoEvents[].Set()代码,这句代码就是通知等待该信号的线程,我已经完成我的任务,你可以获得该信号了,也就是说你执行你自己任务的把握又大了一些。

    在result方法中,我们可以看到WaitHanle.WatiAll()代码,这句代码说明result方法呢,在等待所有的信号变量都变成终止状态,这样他就可以执行自己的代码了。

    执行结果:

    可以看到结果,result是在其他三个方法执行完之后才执行的。

  • 相关阅读:
    php 删除文件夹下的所有文件
    IBM AppScan 安全扫描:加密会话(SSL)Cookie 中缺少 Secure 属性 处理办法
    Tomcat/weblogic session失效时间的几种设置方法
    truncate与delete的区别
    oninput,onpropertychange,onchange的用法和区别
    HttpSessionBindingListener和HttpSessionAttributeListener区别
    insert table 和create table as 区别
    慎用create table as select,一定要注意默认值的问题
    mysql in与or效率比较
    值域范围
  • 原文地址:https://www.cnblogs.com/ATually/p/1857656.html
Copyright © 2011-2022 走看看