• 并发编程-CyclicBarrier


    CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续工作。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier当前线程已经到达了屏障,然后当前线程被阻塞

    使用场景

    当存在需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier

     示例:

    public class CycliBarrierDemo extends Thread{
        @Override
        public void run() {
            System.out.println("开始进行数据分析");
        }
    
        //循环屏障
        //可以使得一组线程达到一个同步点之前阻塞.
    
        public static void main(String[] args) {
            CyclicBarrier cyclicBarrier=new CyclicBarrier
                    (3,new CycliBarrierDemo());
            new Thread(new DataImportThread(cyclicBarrier,"file1")).start();
            new Thread(new DataImportThread(cyclicBarrier,"file2")).start();
            new Thread(new DataImportThread(cyclicBarrier,"file3")).start();
    
        }
    
    }
    public class DataImportThread extends Thread{
    
        private CyclicBarrier cyclicBarrier;
    
        private String path;
    
        public DataImportThread(CyclicBarrier cyclicBarrier, String path) {
            this.cyclicBarrier = cyclicBarrier;
            this.path = path;
        }
    
        @Override
        public void run() {
            System.out.println("开始导入:"+path+" 数据");
            //TODO
            try {
                cyclicBarrier.await(); //阻塞 condition.await()
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    输出结果:

    开始导入:file1 数据
    开始导入:file3 数据
    开始导入:file2 数据
    开始进行数据分析

    注意点

    1)对于指定计数值parties,若由于某种原因,没有足够的线程调用CyclicBarrier的await,则所有调用await的线程都会被阻塞;

    2)同样的CyclicBarrier也可以调用await(timeout, unit),设置超时时间,在设定时间内,如果没有足够线程到达,则解除阻塞状态,继续工作;

    3)通过reset重置计数,会使得进入await的线程出现BrokenBarrierException;

    4)如果采用是CyclicBarrier(int parties, Runnable barrierAction) 构造方法,执行barrierAction操作的是最后一个到达的线程

    实现原理

    CyclicBarrier 相比CountDownLatch 来说,要简单很多,源码实现是基于ReentrantLock 和Condition 的组合使用。CyclicBarrier 和CountDownLatch 是不是很像,只是CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)

  • 相关阅读:
    经典的ajax遍历循环
    fastadmin别名关联表与js下划线冲突问题解决:with里的别名,不要用驼峰,用shippingtype
    thinkphp 临时关闭布局,ajax只输出主题部分
    linux php5.6 链接sql server
    ecstore导入文件开发问题解决 死循环+不兼容mac换行解决
    thinkphp 二级目录安装
    解决crontab执行时间与系统时间不一致的问题
    电阻性能检测的二种方法(转载)
    短路的原因与危害有哪些
    潮湿引发的电路板常见故障(转载)
  • 原文地址:https://www.cnblogs.com/yintingting/p/6648637.html
Copyright © 2020-2023  润新知