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

相关文章
相关标签/搜索