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

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

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

    代码示例:

    代码
    class Program
    {
    staticvoid 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");
    }
    publicdouble 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是在其他三个方法执行完之后才执行的。

  • 相关阅读:
    HDU1080(DP)
    hdu1059(多重背包优化)
    Codeforces Round #190 (Div. 2).D
    jQuery的安装
    JDBC-Statement,prepareStatement,CallableStatement的比较
    execute、executeQuery和executeUpdate之间的区别
    Word操作总结
    Excel 操作总结
    notepad 操作总结
    3.CSS使用基础(2)
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2854450.html
Copyright © 2011-2022 走看看