java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > CyclicBarrier循环栅栏

Java中的CyclicBarrier循环栅栏解析

作者:_Romeo

这篇文章主要介绍了Java中的CyclicBarrier循环栅栏解析,从字面上的意思可以知道,这个类的中文意思是"循环栅栏",大概的意思就是一个可循环利用的屏障,它的作用就是会让所有线程都等待完成后才会继续下一步行动,需要的朋友可以参考下

概念

构造方法

public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)

解析:

重要方法

public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException

解析:

自定义实现一个CyclicBarrier

代码如下:

public class KaneCyclicBarrier {
    private final ReentrantLock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private int count =0; //批次
    private final int parties; //多少线程准备就绪?
    private Object generation = new Object();
    public KaneCyclicBarrier(int parties) {
        this.parties = parties;
    }
    public  void await(){
        final ReentrantLock lock = this.lock;
        lock.lock();
       try {
            final  Object g = generation;
           int index = ++count;
           if (index == parties) {
             nextGeneration();
             return;
           }
           while (true) {
               try {
                   condition.await();
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               if(g!=generation){
                   return;
               }
           }
       }finally {
           lock.unlock();
       }
    }
    public void nextGeneration(){
        condition.signalAll();
        count=0;
        generation = new Object();
    }
}

测试一下,代码如下:

public class CyclicBarrier_Demo {
    public CyclicBarrier_Demo() {
    }
    public static void main(String[] args) throws InterruptedException {
        KaneCyclicBarrier barrier = new KaneCyclicBarrier(4);
        for(int i = 0; i < 100; ++i) {//假设有100个任务,每次只能有固定数量的线程去执行,可以使用这个
            (new Thread(() -> {
                barrier.await();
                System.out.println("任务开始执行");
            })).start();
            Thread.sleep(500L);
        }
    }
}

CyclicBarrier 可以用于多线程计算数据,最后合并计算结果的场景。

CyclicBarrier 与 CountDownLatch 区别

到此这篇关于Java中的CyclicBarrier循环栅栏解析的文章就介绍到这了,更多相关CyclicBarrier循环栅栏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文