java|Java多线程确保子线程执行完再执行-循环栅栏CyclicBarrier

CyclicBarrier介绍 CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 栅栏r。
【java|Java多线程确保子线程执行完再执行-循环栅栏CyclicBarrier】CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),有最后一个线程执行。
对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 InterruptedException)以反常的方式离开。
例子 通过上面的介绍,可以通过生活中的列子加深对于此方法的使用场景:

礼拜天了,公司小王约了公司4个美女去郊游,总共5人,由小王开车,约好了上午7点在指定地点集合

约好了时间地点,如果人不全肯定需要等待,不能把没到的扔下离开,下面我们用程序来实现这个例子。
代码示例
public class Test { public static void main(String[] args) { String[] person = new String[] {"小王","1号","2号","3号","4号"}; final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("人都到齐了,出发去郊游……"); } }); for(int i=0; i<5; i++) { new Outing(person[i],barrier).start(); try { TimeUnit.MILLISECONDS.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }class Outing extends Thread { String name; CyclicBarrier barrier; public Outing(String name,CyclicBarrier barrier) { this.name = name; this.barrier = barrier; } public void run() { System.out.println(name+"到了"); try { barrier.await(); //线程到了屏障了,例子中就是人上车了,如果还有没到的就要等待 } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }

    推荐阅读