zoukankan      html  css  js  c++  java
  • 并发编程-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)

  • 相关阅读:
    caffe常用层: batchNorm层和scale层
    简述configure、pkg-config、pkg_config_path三者的关系
    python删除list中元素的三种方法
    Leetcode 872. Leaf-Similar Trees
    Leetcode 508. Most Frequent Subtree Sum
    Leetcode 572. Subtree of Another Tree
    Leetcode 894. All Possible Full Binary Trees
    Leetcode 814. Binary Tree Pruning
    Leetcode 557. Reverse Words in a String III
    python 多维list声明时的小问题
  • 原文地址:https://www.cnblogs.com/yintingting/p/6648637.html
Copyright © 2011-2022 走看看