• 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是在其他三个方法执行完之后才执行的。

  • 相关阅读:
    div居中方法总结
    windows下配置nginx环境
    webpack+babel+react操作小结
    JavaScript数组常用操作总结
    MyBatis使用Generator自动生成代码
    如何上Chrome谷歌商店
    深入理解Spring IOC
    SpringMVC概要总结
    mybatis防止sql注入
    Redis和Memcache的区别分析
  • 原文地址:https://www.cnblogs.com/ATually/p/1857656.html
Copyright © 2020-2023  润新知