Java中的CyclicBarrier循环栅栏解析

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

概念

  • 从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。
  • 它的作用就是会让所有线程都等待完成后才会继续下一步行动。
  • 举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。

构造方法

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

解析:

  • parties 是参与线程的个数
  • 第二个构造方法有一个 Runnable 参数,这个参数的意思是最后一个到达线程要做的任务

重要方法

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

解析:

  • 线程调用 await() 表示自己已经到达栅栏
  • BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时

自定义实现一个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 区别

  • CountDownLatch 是一次性的,CyclicBarrier 是可循环利用的
  • CountDownLatch减计数,CyclicBarrier加计数。
  • CountDownLatch 参与的线程的职责是不一样的,有的在倒计时,有的在等待倒计时结束。CyclicBarrier 参与的线程职责是一样的。

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

相关文章

  • Java实现WORD和PDF互相转换以及数据填充示例

    Java实现WORD和PDF互相转换以及数据填充示例

    本文介绍了如何使用Java实现WORD和PDF的互转以及数据填充功能,通过导入Aspose库并使用其工具类,可以轻松实现WORD和PDF模板的填充和转换,需要的朋友可以参考下
    2025-02-02
  • JDBC连接MySQL并实现模糊查询

    JDBC连接MySQL并实现模糊查询

    本文详细讲解了JDBC连接MySQL并实现模糊查询的方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Java常见运算符之位运算符大全

    Java常见运算符之位运算符大全

    这篇文章主要介绍了Java常见运算符之位运算符的相关资料,包括按位与、按位或、按位异或、按位取反、左移、右移和无符号右移,这些运算符在判断奇偶、交换变量、计算绝对值、判断是否为2的幂以及快速计算2的幂次方等方面有广泛应用,需要的朋友可以参考下
    2025-04-04
  • java读取properties配置文件的方法

    java读取properties配置文件的方法

    这篇文章主要介绍了java读取properties配置文件的方法,涉及java操作properties配置文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Java 浅复制和深复制的实例详解

    Java 浅复制和深复制的实例详解

    这篇文章主要介绍了Java 浅复制和深复制的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • java中对象调用成员变量与成员实例方法

    java中对象调用成员变量与成员实例方法

    在本篇文章里小编给各位分享的是关于java中对象调用成员变量与成员实例方法,需要的朋友们可以学习参考下。
    2020-02-02
  • IDEA全局查找关键字的用法解读

    IDEA全局查找关键字的用法解读

    这篇文章主要介绍了IDEA全局查找关键字的用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mybatis如何实现继承映射

    mybatis如何实现继承映射

    这篇文章主要介绍了mybatis如何实现继承映射的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot统一响应格式及统一异常处理

    SpringBoot统一响应格式及统一异常处理

    在我们开发SpringBoot后端服务时,一般需要给前端统一响应格式,本文主要介绍了SpringBoot统一响应格式及统一异常处理
    2023-05-05
  • SpringCloud OpenFeign与Ribbon客户端配置详解

    SpringCloud OpenFeign与Ribbon客户端配置详解

    在springcloud中,openfeign是取代了feign作为负载均衡组件的,feign最早是netflix提供的,他是一个轻量级的支持RESTful的http服务调用框架,内置了ribbon,而ribbon可以提供负载均衡机制,因此feign可以作为一个负载均衡的远程服务调用框架使用
    2022-11-11

最新评论