和CountDownLatch有點相似,CyclicBarrier也是相似一個柵欄操做----等待子線程所有執行完再執行下個動做;可是CyclicBarrier能重複使用,CountDownLatch只能用一次,dom
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任務;ide
cyclic.await();表示等全部子任務完成就會去執行CyclicBarrier中定義的BarrierRun任務;this