zoukankan      html  css  js  c++  java
  • Barrier

        使多个任务能够采用并行方式依据某种算法在多个阶段协同工作。

        通俗理解:张三、李四和赵五(多个人)都要去乘旅游大巴【多个任务,并行】

             乘车过程都为从家里出来,步行至车站【某种算法】

             所有人都到达车站,才能开车【协同工作】

        通过在一系列阶段间移动来协作完成一组任务,此时该组中的每个任务发信号指出它已经到达指定阶段的 Barrier 并且暗中等待其他任务到达。 相同的 Barrier 可用于多个阶段。

        通俗理解:张三、李四和赵五分别进行自己的步行至车站任务,人到车开【多阶段协作完成一组任务】

              张三到达车站【到达指定阶段的Barrier,并等待其他任务到达】大喊"我到了"【任务发出信号】

        代码实现:

    class Program

    {

    static Barrier sync;

    static void Main(string[] args)

    {

    sync = new Barrier(3);

    var ZhangSan = new Thread(() => WalkToStation("张三",3)); ZhangSan.Start();

    var LiSi = new Thread(()=>WalkToStation("李四",1)); LiSi.Start();

    var ZhaoWu=new Thread(()=>WalkToStation("赵五",2)); ZhaoWu.Start();

     

    ZhangSan.Join();

    LiSi.Join();

    ZhaoWu.Join();

     

    Console.WriteLine("车开走啦!");

    Console.Read();

    }

     

    static void WalkToStation(string name,int time)

    {

    Console.WriteLine("[{0}]走出家门,开始步行{1}公里", name,time);

    Thread.Sleep(time*1000);

    Console.WriteLine("[{0}]到达车站", name);

    sync.SignalAndWait();

    Console.WriteLine("[{0}]坐上车了", name);

     

    }

    }

        取消任务的执行使用Cancellation Token,当调用Cancel时,会触发OperationCanceledException结束任务的执行。

        代码实现:

    class Program

    {

    static Barrier sync;

    static CancellationToken token;

    static void Main(string[] args)

    {

    var source = new CancellationTokenSource();

    token = source.Token;

     

    sync = new Barrier(3);

    var ZhangSan = new Thread(() => WalkToStation("张三",1)); ZhangSan.Start();

    var LiSi = new Thread(()=>WalkToStation("李四",3)); LiSi.Start();

    var ZhaoWu=new Thread(()=>WalkToStation("赵五",2)); ZhaoWu.Start();

     

    source.Cancel();

     

    ZhangSan.Join();

    LiSi.Join();

    ZhaoWu.Join();

     

    Console.WriteLine("车开走啦!");

    Console.Read();

    }

     

    static void WalkToStation(string name,int time)

    {

    try

    {

    Console.WriteLine("[{0}]走出家门,开始步行{1}公里", name, time);

    Thread.Sleep(time * 1000);

    Console.WriteLine("[{0}]到达车站", name);

     

    sync.SignalAndWait(token);

     

    Console.WriteLine("[{0}]坐上车了", name);

    }

    catch(OperationCanceledException)

    {

    Console.WriteLine("出行取消,各回各家");

    }

     

    }

    }

  • 相关阅读:
    asp.net mvc 从数据库中读取图片
    给折腾ramdisk的朋友们一点建议
    docker安装Jenkins和构建python容器
    docker笔记
    接口加密方式
    Dockerfile常用命令
    北斗七星小队团队展示
    固件程序设计实验内容1.4
    Myod实验 20181328祝维卿
    电子公文系统团队作业(四):描述设计
  • 原文地址:https://www.cnblogs.com/yijiaoyingbi/p/4959387.html
Copyright © 2011-2022 走看看