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号选手 起跑!

posted @ 2018-08-30 09:56  不是植物  阅读(207)  评论(0编辑  收藏  举报