Java并发编程之java.util.concurrent包——CyclicBarrier篇

手把手调试Android 14 ShellTransitions:用Log追踪ActiveTransition与Handler匹配过程 本文详细介绍了在Android 14中调试ShellTransitions机制的方法,重点通过Log追踪ActiveTransition与Handler的匹配过程。文章提供了关键日志点植入策略、Handler匹配机制解析及实战调试案例,帮助开发者解决窗口转场动画中的卡顿和错乱问题,提升系统动画性能。 阅读详情

概念

  • 从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。

  • 它的作用就是会让所有线程都等待完成后才会继续下一步行动。

  • 举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 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 参与的线程职责是一样的。
51单片机计算器(源程序+流程图+答辩报告+综合设计) 保姆级讲解!C语言编程,使用51单片机及LCD1602显示屏实现! 阅读详情

相关推荐

SystemVerilog实战:AXI Stream协议从零搭建(附完整代码解析)

本文详细介绍了如何使用SystemVerilog从零搭建AXI Stream协议,包括核心信号解析、接口设计、主从设备实现及验证环境构建。通过完整的代码示例和工程实践技巧,帮助开发者掌握AXI Stream在FPGA/ASIC设计中的高效数据传输方法,特别适合视频处理和网络数据传输等应用场景。

weixin_29207439的博客 359

【Java】已解决:`java.util.concurrent.BrokenBarrierException`

方法并等待其他线程到达屏障时,如果其中一个线程在到达屏障之前中断或超时,或者其他线程未能按预期到达屏障,就会导致屏障破坏,从而抛出。上同步时,但由于某些原因,屏障(Barrier)被破坏,导致其中的一个或多个线程无法继续执行。本文将详细分析该异常的背景、原因,并通过错误和正确的代码示例帮助您更好地理解和解决这个问题。是这些工具类中的一个,常用于让一组线程在某个特定点上同步。方法,等待其他线程到达同步点。然而,如果其中一个线程发生异常或被中断,包提供了许多实用的工具类,用于管理多线程之间的同步和通信。

屿小夏.的知识博客 813

保姆级教程:用Ansys Workbench找出BGA焊点最容易坏的位置(附热循环+振动分析)

本文提供了一份详细的Ansys Workbench教程,指导如何通过热循环和振动分析找出BGA焊点最容易失效的位置。从模型搭建、材料定义到网格划分和载荷设置,全面解析了BGA焊点可靠性分析的全流程,帮助工程师提前预防焊点开裂问题,提升电子封装设计的可靠性。

weixin_30983965的博客 417

【Java】已解决:java.util.concurrent.BrokenBarrierException

用于让一组线程互相等待,直到所有线程都到达某个屏障点再继续执行。当其中一个线程在等待时被中断或超时,或任何线程在屏障点被中断时,该异常就会被抛出。为了解决上述问题,我们需要确保所有线程在屏障前不会被中断,并且处理好可能的异常。在这个例子中,所有线程在屏障前不会被中断,并且正确处理了可能的异常。在上述代码中,如果有线程在等待时被中断或超时,就可能抛出。这种异常通常发生在并发编程场景中,通过这些注意事项,可以有效减少和避免。的发生,确保并发任务的正确执行。

屿小夏.的知识博客 714

Linux实战:rMATS可变剪切分析从零到一,避坑指南与结果深度解析

本文详细介绍了在Linux系统上从零开始部署rMATS进行可变剪切分析的完整流程,包括环境搭建、安装避坑指南、参数优化及结果解读。特别针对gfortran依赖、数学库配置等常见问题提供解决方案,并深入解析JC与JCEC结果的差异及可视化技巧,帮助生物信息学研究者高效完成可变剪切分析。

weixin_30394669的博客 408

手把手教你编写I2C读写EEPROM代码(驱动层实现)

从底层寄存器配置到时序控制,详解如何编写可移植的I2C读写EEPROM代码,覆盖起始信号、地址帧、数据收发及ACK应答等关键环节,确保在STM32、ESP32等主流平台稳定运行,真正落地i2c读写eeprom代码需求。

weixin_35756130的博客 506

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

已解决解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

小明的Java问道之路 2010

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2587

已解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

已解决java.util.concurrent.BrokenBarrierException异常的正确解决方法,亲测有效!!!

小明的Java问道之路 1087

CryoEM - 使用 ChimeraX 工具 操作 冷冻电镜的 MRC 密度图(Density Map) 教程

由冷冻电镜 CryoSparc 软件所生成的 Volume,需要观察其内部结构,建议使用 ChimeraX 进行操作。

AGI 4959

Nature Communications|马兰戈尼效应构建空心金字塔微阵列制备高灵敏度柔性电容式压力传感器(健康监测/柔性压力传感/柔性电子/人机交互)

三维(3D)微结构因其在柔软性、轻质化、对3D表面的贴合性和可压缩性方面的显著优势,已经在生物医学监测、人机接口、机器人触觉和微型飞行器等领域引起了广泛关注。柔性电容式压力传感器(CPSs),由两片平行板组成,中间夹着一层软介电薄膜,具有设备构造简单、高灵敏度和快速响应速度等众多吸引人的优点。结构化介电层的三维机械设计在决定传感器性能方面起着至关重要的作用,如灵敏度(这是压力传感器的关键特性,因为它决定了感知微小压力和获取更多细节的能力,如轻柔触摸和脉搏检测)。

感知科学前沿 526

如何解决 java.util.concurrent.BrokenBarrierException 异常?亲测有效的解决方法!

是一个在 Java 并发编程中较常见的异常,通常在使用时遇到。它表明某个线程在等待其他线程时,发生了不可恢复的错误,导致屏障被破坏。下面将详细分析该异常的原因和解决方法。

猿鹏探码的博客 1283

【音视频】PJSIP库——示例简介、C++类说明

aectest音频回声消除测试工具,用于演示音频处理模块中的回声消除(AEC)功能,通常用于 VoIP 场景中优化语音质量。auddemo音频播放 / 录制演示,展示如何使用 PJProject 的音频接口进行基本的音频数据采集、播放和处理,例如波形显示或格式转换。stereotest立体声处理测试,可能用于演示多声道音频的处理方式,如混音、声道分离等。tonegen音频信号生成工具,用于生成测试用的音频信号(如正弦波、音调等),常用于音频设备测试或调试。recfile。

郭老二 434

java.util.concurrent包

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中,您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全之类的概念。 在这里查看 ! 目录 1.简介 2. java.util.concurrent 2.1。 执行者 2.2。 执行器服务 2.3。 并发集合 ...

最佳 Java 编程 961

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java.util.concurrent介绍

1. 概述 该的java.util.concurrent包提供了创建并发应用程序的工具。 在本文中,我们将对整个包进行概述。 2. 主要部件 该java.util.concurrent中包含了太多的功能,在一个写了讨论。在本文中,我们将主要关注此包中一些最有用的实用程序,如: Executor ExecutorService ScheduledExecutorService Future Co...

淡定_蜗牛的博客 1672

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java.util.Concurrent包下面的常见类

java.util.Concurrent包下面的常见类 1BlockingQueue (1)阻塞队列 BlockingQueue简介 java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。本节不会讨论如何在 Java 中实现一个你自己的 BlockingQueue。如果你对那...

weixin_41563161的博客 1915

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java.util.concurrent 包介绍

文章目录1.介绍2.主要组件2.1. Executor2.2. ExecutorService2.3. ScheduledExecutorService2.4. Future2.5. CountDownLatch2.6. CyclicBarrier2.7. Semaphore2.8. ThreadFactory2.9.BlockingQueue2.10. DelayQueue2.11. Locks2.12. Phaser 1.介绍 java.util.concurrent 包提供了用于创建并发应用程序的工具

盲目的拾荒者的博客 1955

【并发多线程】java.util.concurrent简介

java.util.concurrent包提供了很多有用的类,方便我们进行并发程序的开发。本文将会做一个总体的简单介绍。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 1081

java.util.concurrent简介

文章目录主要的组件ExecutorExecutorServiceScheduledExecutorServiceFutureCountDownLatchCyclicBarrierSemaphoreThreadFactory java.util.concurrent简介 java.util.concurrent包提供了很多有用的类,方便我们进行并发程序的开发。本文将会做一个总体的简单介绍。 主要的组...

程序那些事 1万+

java concurrent 包_java.util.concurrent包的拆解

java.util.concurrent包:1.locks部分:显式锁(互斥锁和速写锁)相关2.atomic部分:原子变量类相关,是构建非阻塞算法的基础3.executor部分:线程池相关4.collection部分:并发容器相关5.tools部分:同步工具相关,如信号量、闭锁、栅栏等功能1.collection部分:1.1 BlockingQueueBlockingQueue为接口,如果要用它,...

weixin_32001191的博客 85

java.util.concurrent.CyclicBarrier类的源码和总结

下面是我对CyclicBarrier 类的注释内容 CyclicBarrier 类比较简单,前提需要掌握ReentrantLock原理如果感觉没看够在juc专栏中找,关于ReentrantLock我写了好几篇博客,有详细的说明。 总结: 内部实际上通过ReentrantLock控制线程以及通过ReentrantLock得到Condition接口,通过condition控制线程 CyclicBarrier的使用则是通过new CyclicBarrier(10)表示可以拦截10个线程,然后在多线程中通过awai

诗水人间 3万+

Java并发基础:一文讲清util.concurrent包的作用

java.util.concurrent包是 Java 中用于并发编程的重要工具集,提供了线程池、原子变量、并发集合、同步工具类、阻塞队列等一系列高级并发工具类,使用这些工具类可以极大地简化并发编程的难度,减少出错的可能性,提高程序的效率和可维护性。

科技互联网领域深度探索者,乐于分享与写作。 2487

Java并发编程CyclicBarrier CyclicBarrier是java.util.concurrent包下面的一个工具类

Java并发编程CyclicBarrier CyclicBarrier是java.util.concurrent包下面的一个工具类

m0_58745896的博客 153

java util concurrent_java.util.concurrent简介

java.util.concurrent简介java.util.concurrent包提供了很多有用的类,方便我们进行并发程序的开发。本文将会做一个总体的简单介绍。主要的组件java.util.concurrent包含了很多内容, 本文将会挑选其中常用的一些类来进行大概的说明:ExecutorExecutorServiceScheduledExecutorServiceFutureCountDow...

weixin_39614546的博客 356

Jdk源码阅读之Java.util.concurrent

Jdk源码阅读之Java.util.concurrent,首先,简单的介绍下这个小工具包集合     java.util.concurrent 是在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。     一、执行程序     接口Executor是一个简单的标准化接口,用于定义类似于线程的自

一蓑烟雨任平生,也无风雨也无晴! 801
上一篇: Java并发编程之java.util.concurrent包——CountDownLatch篇
下一篇: 基于HTTP的长轮询实现
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值