和CountDownLatch有点类似,CyclicBarrier也是类似一个栅栏操作----等待子线程全部执行完再执行下个动作;但是CyclicBarrier能重复使用,CountDownLatch只能用一次,
public class CyclicBarrierDemo { public static class Soldier implements Runnable{ private String soldier; private final CyclicBarrier cyclic; Soldier(CyclicBarrier cyclic,String soldierName){ this.cyclic=cyclic; this.soldier=soldierName; } @Override public void run() { try { System.out.println(soldier+"报道");//执行士兵报道任务 cyclic.await();//等所有士兵报道完成执行CyclicBarrier中定义的BarrierRun动作 doWork();//CyclicBarrier清零,执行士兵工作任务 cyclic.await();//等所有士兵工作完成执行CyclicBarrier中定义的BarrierRun动作 } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } void doWork(){ try { Thread.sleep(Math.abs(new Random().nextInt()%10000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(soldier+":任务完成"); } } public static class BarrierRun implements Runnable{ public BarrierRun(boolean flag, int n) { this.flag = flag; this.N = n; } boolean flag; int N; @Override public void run() { if(flag){ System.out.println("司令:[士兵" +N+"个,任务完成!]"); }else{ System.out.println("司令:[士兵" +N+"个,集合完毕!]"); flag=true; } } } public static void main(String[] args) { final int N=3; Thread[] allSoldier=new Thread[N]; boolean flag=false; CyclicBarrier cyclic=new CyclicBarrier(N,new BarrierRun(flag,N)); System.out.println("集合队伍"); for(int i=0;i<N;i++){ allSoldier[i]=new Thread(new Soldier(cyclic,"士兵"+i)); allSoldier[i].start(); } } } 执行结果如下: 集合队伍 士兵1报道 士兵2报道 士兵0报道 司令:[士兵3个,集合完毕!] 士兵1:任务完成 士兵2:任务完成 士兵0:任务完成 司令:[士兵3个,任务完成!]
解析:定义了一个CyclicBarrier cyclic=new CyclicBarrier(N,new BarrierRun(flag,N));N代表子任务有N个,当子任务都完成时执行BarrierRun任务;
cyclic.await();表示等所有子任务完成就会去执行CyclicBarrier中定义的BarrierRun任务;