美文网首页
并发编程 - CyclicBarrier

并发编程 - CyclicBarrier

作者: 52HzBoo | 来源:发表于2018-09-03 21:41 被阅读0次

    CyclicBarrier 循环栅栏

    CyclicBarrier 相对比CoundDownLatch强大且复杂
    下面模拟士兵集合、执行任务等操作

    Soldier - 士兵

    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    /**
     * 模块:【CyclicBarrier - 士兵】
     * <p>
     * 开发: Bruce.Liu By 2018/9/3 下午8:54 Create
     */
    public class Soldier implements Runnable {
    
        //定义名称
        private String soldierName;
    
        private final CyclicBarrier cyclic;
    
        /**
         * 构造函数
         */
        public Soldier(CyclicBarrier cyclic, String soldierName) {
            this.cyclic = cyclic;
            this.soldierName = soldierName;
        }
    
        @Override
        public void run() {
            try {
                //执行阻塞等待,等所有人到期
                cyclic.await();
                //所有人到齐后开始执行任务
                doWork();
                //执行阻塞等待,等待所有人执行任务完成
                cyclic.await();
            } 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.err.println(soldierName + " - 任务执行完成!");
        }
    }
    

    BarrierRun - 司令

    CyclicBarrier 可以接首一个参数作为barrier,这里即当前定义的BarrierRun,
    每当barrier计数器循环一次完成(例10个完成后)后会执行,
    可以参考执行结果。

    /**
     * 模块:【CyclicBarrier - 司令】
     * <p>
     * 开发: Bruce.Liu By 2018/9/3 下午9:04 Create
     */
    public class BarrierRun implements Runnable {
    
        boolean flag ;
        Integer n ;
    
        public BarrierRun(boolean flag, Integer n) {
            this.flag = flag;
            this.n = n;
        }
    
        @Override
        public void run() {
            if(flag){
                System.err.println("司令:【士兵"+n+"个,任务完成!】");
            } else {
                System.err.println("司令:【士兵"+n+"个,集合完毕!】");
                flag = true;
            }
        }
    
    }
    

    Demo - 测试

    /**
     * 模块:【CyclicBarrier 循环栅栏】
     * <p>
     * 开发: Bruce.Liu By 2018/9/3 下午8:43 Create
     */
    public class CyclicBarrierDemo {
    
        public static void main(String[] args) {
            boolean flag = false;
            final int n = 10 ;
            Thread [] ts = new Thread[n];
            CyclicBarrier cyclic = new CyclicBarrier(n,new BarrierRun(flag,n));
            System.err.println("队伍集合!");
            for(int i = 0 ; i < n; ++i){
                System.err.println("士兵:"+i+"报道!");
                ts[i] = new Thread(new Soldier(cyclic,"士兵:"+i));
                ts[i].start();
            }
        }
    }
    

    执行结果

    队伍集合!
    士兵:0报道!
    士兵:1报道!
    士兵:2报道!
    士兵:3报道!
    士兵:4报道!
    士兵:5报道!
    士兵:6报道!
    士兵:7报道!
    士兵:8报道!
    士兵:9报道!
    司令:【士兵10个,集合完毕!】
    士兵:4 - 任务执行完成!
    士兵:0 - 任务执行完成!
    士兵:9 - 任务执行完成!
    士兵:1 - 任务执行完成!
    士兵:8 - 任务执行完成!
    士兵:3 - 任务执行完成!
    士兵:2 - 任务执行完成!
    士兵:7 - 任务执行完成!
    士兵:6 - 任务执行完成!
    士兵:5 - 任务执行完成!
    司令:【士兵10个,任务完成!】

    参考:《实战 Java 高并发程序设计》这本书。

    相关文章

      网友评论

          本文标题:并发编程 - CyclicBarrier

          本文链接:https://www.haomeiwen.com/subject/wxziwftx.html