美文网首页
CyclicBarrier

CyclicBarrier

作者: 七月_JulyFY | 来源:发表于2019-08-24 00:48 被阅读0次

    栅栏屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程 到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线 程数量,每个线程调用await方法告CyclicBarrier我已经到达了屏障,然后当前线程被阻塞

    方法:

    cyclicBarrier.await()

    应用场景:

    可以用于多线程计算数据,最后合并计算结果的场景。例如,用一个Excel保存了用户 所有银行流水,每个Sheet保存一个账户近一年的每笔银行流水,现在需要统计用户的日均 银行流水,先用多线程处理每个sheet里的银行流水,都执行完之后,得到每个sheet的日均银行流水,最后,再用barrierAction用这些线程的计算结果,计算出整个Excel的日 均银行流水

    示例代码:

    /**
     * @author qy
     * @date 2019/8/23 14:46
     * @description
     */
    public class CyclicBarrierTest implements Runnable {
    
        private CyclicBarrier cyclicBarrier;
        private int index;
    
        public CyclicBarrierTest(CyclicBarrier cyclicBarrier, int index) {
            this.cyclicBarrier = cyclicBarrier;
            this.index = index;
        }
    
        public void run() {
            try {
                System.out.println("index:" + index);
                index--;
                cyclicBarrier.await();
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws Exception {
            CyclicBarrier cyclicBarrier = new CyclicBarrier(11, new Runnable() {
                public void run() {
                    System.out.println("所有特工到达屏障,准备开始执行秘密任务");
                }
            });
            for (int i = 0; i < 10; i++) {
                new Thread(new CyclicBarrierTest(cyclicBarrier, i)).start();
            }
            cyclicBarrier.await();
            System.out.println("全部到达屏障....");
        }
    }
    

    结果:

    index:1
    index:2
    index:0
    index:3
    index:4
    index:8
    index:6
    index:7
    index:9
    index:5
    所有特工到达屏障,准备开始执行秘密任 务
    全部到达屏障....
    
    

    相关文章

      网友评论

          本文标题:CyclicBarrier

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