• CyclicBarrier[进程同步辅助类]实现进程间同步


    CyclicBarrier类

    1、概念

    一个进程同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点。

    2、使用场景

    需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier

    3、常用方法

    await()

    4、代码演示

     1 public class CyclicBarrierTest {
     2  
     3     public static void main(String[] args) throws IOException, InterruptedException {
     4         //如果将参数改为4,但是下面只加入了3个选手,这永远等待下去
     5         //Waits until all parties have invoked await on this barrier. 
     6         CyclicBarrier barrier = new CyclicBarrier(3);
     7  
     8         ExecutorService executor = Executors.newFixedThreadPool(3);
     9         executor.submit(new Thread(new Runner(barrier, "1号选手")));
    10         executor.submit(new Thread(new Runner(barrier, "2号选手")));
    11         executor.submit(new Thread(new Runner(barrier, "3号选手")));
    12  
    13         executor.shutdown();
    14     }
    15 }
    16  
    17 class Runner implements Runnable {
    18     // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
    19     private CyclicBarrier barrier;
    20  
    21     private String name;
    22  
    23     public Runner(CyclicBarrier barrier, String name) {
    24         super();
    25         this.barrier = barrier;
    26         this.name = name;
    27     }
    28  
    29     @Override
    30     public void run() {
    31         try {
    32             Thread.sleep(1000 * (new Random()).nextInt(8));
    33             System.out.println(name + " 准备好了...");
    34             // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
    35             barrier.await();
    36         } catch (InterruptedException e) {
    37             e.printStackTrace();
    38         } catch (BrokenBarrierException e) {
    39             e.printStackTrace();
    40         }
    41         System.out.println(name + " 起跑!");
    42     }
    43 }

    5、输出结果

     3号选手 准备好了...

    2号选手 准备好了...

    1号选手 准备好了...

    1号选手 起跑!

    2号选手 起跑!

    3号选手 起跑!

  • 相关阅读:
    Gym
    HDU 4087 ALetter to Programmers (三维坐标旋转 矩阵 + 矩阵快速幂)
    POJ 3845 Fractal (向量旋转,好题)
    HDU 1700 Points on Cycle (向量旋转 + 圆内接三角形周长和面积最大的是正三角形)
    POJ 1271 Nice Milk (半平面交应用)
    POJ 2540 Hotter Colder (半平面交应用 + 向量旋转)
    luoguP3705 [SDOI2017]新生舞会
    luoguP4123 [CQOI2016]不同的最小割
    luoguP2046 [NOI2010]海拔
    luoguP3227 [HNOI2013]切糕
  • 原文地址:https://www.cnblogs.com/zhuziyu/p/9558364.html
Copyright © 2020-2023  润新知