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