CyclicBarrier學習筆記

和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

相關文章
相關標籤/搜索