CyclicBarrier线程辅助类的简单使用

news2025/2/5 17:49:42

文章目录

    • 简述
    • 内部机制
    • 构造函数
    • 使用案例
    • 异常处理

在这里插入图片描述

简述

CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类,它允许一组线程互相等待彼此到达一个共同的屏障点(barrier)。与 CountDownLatch 不同的是,CyclicBarrier 可以被重置并且可以重复使用13。这意味着一旦所有参与的线程都到达了屏障点并继续执行后,CyclicBarrier 可以再次用于下一轮的同步操作。这使得 CyclicBarrier 在循环任务或需要多次同步的情况下非常有用。

CyclicBarrier 提供了一个构造函数来指定参与的线程数量,并且可以选择性地提供一个当最后一个线程到达屏障时要执行的动作。这个动作将在所有线程到达之前但在任何线程继续前进之后被执行。如果任意一个线程在等待过程中被打断或失败,那么所有的线程都会收到一个 BrokenBarrierException 异常。

内部机制

CyclicBarrier 的内部实现依赖于计数器和条件变量(通常是锁和相关的等待/通知机制)。每当一个线程调用了 await() 方法时,它会首先检查计数器是否达到了创建 CyclicBarrier 时指定的“阈值”(即需要等待的线程数)。如果计数器尚未达到阈值,线程会被阻塞并等待其他线程的到来。当另一个线程也调用了 await() 方法并且计数器达到了阈值时,所有等待在屏障点的线程都会被唤醒,并继续执行。此时,计数器会被重置为0,屏障进入下一轮使用。

此外,CyclicBarrier 还提供了一个可选的 Runnable 参数。当所有线程都到达屏障点时,这个 Runnable 任务会在最后一个到达屏障点的线程中执行。这通常用于进行一些额外的初始化、汇总或清理工作。

构造函数

CyclicBarrier 提供了两个构造函数:

  • CyclicBarrier(int parties):创建一个新的 CyclicBarrier 实例,该实例将在给定数量的参与者(线程)到达后触发。
  • CyclicBarrier(int parties, Runnable barrierAction):除了指定参与者数量外,还指定了一个当所有参与者都到达屏障点时要执行的动作。

使用案例

一个典型的 CyclicBarrier 使用场景是多线程计算数据,当所有线程完成各自的计算后,在 CyclicBarrier 回调线程中合并计算结果。例如,统计用户每个季度的银行流水情况,可以先使用多线程分别统计每个月的数据,之后再将这些数据汇总起来得到整个季度的结果。

public class CyclicBarrierTest implements Runnable {
    private CyclicBarrier cb = new CyclicBarrier(3, this); // 创建CyclicBarrier实例,屏障数据设为3,处理完之后执行当前类的run方法
    private Executor executor = Executors.newFixedThreadPool(3); // 创建线程池,只有三个月的数据,所以只需三个线程
    private ConcurrentHashMap<String, Integer> sheetBankWaterCount = new ConcurrentHashMap<>(); // 保存每个sheet计算出的结果

    public void count() {
        for (int i = 0; i < 3; i++) {
            executor.execute(() -> {
                // 模拟复杂逻辑处理代码
                sheetBankWaterCount.put(Thread.currentThread().getName(), 1);
                try {
                    cb.await(); // 线程完成工作后调用await设置屏障
                } catch (BrokenBarrierException | InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    @Override
    public void run() {
        int res = 0;
        for (Map.Entry<String, Integer> sheet : sheetBankWaterCount.entrySet()) {
            res += sheet.getValue();
        }
        sheetBankWaterCount.put("result", res);
        System.out.println(res);
    }

    public static void main(String[] args) {
        CyclicBarrierTest test = new CyclicBarrierTest();
        test.count(); // 注意,此时不需要调用test.run,最后一个await方法会调用run方法
    }
}

在这个例子中,我们创建了一个 CyclicBarrier 实例,并设置了屏障点为,意味着我们需要等待三个线程都到达屏障点。同时,我们也定义了一个 Runnable 作为回调函数,用于在线程们全部到达屏障点后执行汇总操作。

异常处理

需要注意的是,如果某个线程在等待过程中因为中断或异常而退出,那么所有等待在屏障点的线程都将收到一个 BrokenBarrierException 异常。这是因为屏障已经被“破坏”,无法再保证所有线程都能正常通过。因此,在实际应用中应该妥善处理这类异常情况,确保系统的健壮性1。

总之,CyclicBarrier 是一种非常有用的工具,特别适合那些需要多次同步多个线程的应用场景。通过合理地配置参数和编写回调函数,可以有效地协调多个线程之间的协作行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B站推荐模型数据流的一致性架构

01 背景 推荐系统的模型&#xff0c;通过学习用户历史行为来达到个性化精准推荐的目的&#xff0c;因此模型训练依赖的样本数据&#xff0c;需要包括用户特征、服务端推荐的视频特征&#xff0c;以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流&#xff0c;即为…

无需训练!多提示视频生成最新SOTA!港中文腾讯等发布DiTCtrl:基于MM-DiT架构

文章链接&#xff1a;https://arxiv.org/pdf/2412.18597 项目链接&#xff1a;https://github.com/TencentARC/DiTCtrl 亮点直击 DiTCtrl&#xff0c;这是一种基于MM-DiT架构的、首次无需调优的多提示视频生成方法。本文的方法结合了新颖的KV共享机制和隐混合策略&#xff0c;使…

尔湾市圣诞节文化交流会成功举办,展示多元文化魅力

洛杉矶——12月21日,圣诞节文化交流会在尔湾成功举办。圣诞节文化交流会旨在促进不同文化之间的交流与理解。通过举办舞蹈表演、演讲和互动游戏等,为参与者提供了一个展示和欣赏多元文化艺术的平台。这些活动不仅增加了社区成员之间的互动,也加深了他们对不同文化传统和艺术形式…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

Spring Cloud LoadBalancer (负载均衡)

目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB) , 是高并发, 高可用系统必不可少的关…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

HCIA-Access V2.5_7_1_XG(S)原理_系统概述

近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求&#xff0c;业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求&#xff0c;而GPON已经向10G GPON演示&#xff0c;本章将介绍1…

安装了python,环境变量也设置了,但是输入python不报错也没反应是为什么?window的锅!

目录 问题 结论总结 衍生问题 1 第1步&#xff1a;小白python安装&#xff0c;不要埋头一直点下一步&#xff01;&#xff01;&#xff01; 2 第2步&#xff1a;可以选择删了之前的&#xff0c;重新安装python 3 第3步&#xff1a;如果你不想或不能删了重装python&#…

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

计算机网络 (13)信道复用技术

前言 计算机网络中的信道复用技术是一种提高网络资源利用率的关键技术。它允许在一条物理信道上同时传输多个用户的信号&#xff0c;从而提高了信道的传输效率和带宽利用率。 一、信道复用技术的定义 信道复用&#xff08;Multiplexing&#xff09;就是在一条传输媒体上同时传输…

2236. 判断根结点是否等于子结点之和

给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于两个子结点值之和&#xff0c;返回 true &#xff0c;否则返回 false 。 示例 1&#xff1a; 输入&#xff1a;root [10,4,6] 输出&#xf…

orm03

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

UE5材质节点Panner

Panner节点可以让贴图动起来&#xff0c;快捷键是P&#xff0c;Speed的数值大小就是贴图移动的快慢&#xff0c;x和y是方向 这个节点可以用来做&#xff0c;传送带&#xff0c;护盾&#xff0c;河流&#xff0c;岩浆&#xff0c;瀑布等 制作岩浆流动效果 创建材质&#xff0c;…

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo

【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo 前言摘要引言Task 相关工作方法SDM-UniPS预处理尺度不变的空间光特征编码器像素采样变压器的非局部交互 PS-Mix数据集 实验结果训练细节评估和时间&#xff1a; 消融实验定向照明下的评估没有对…

道路倒角 三角网 两侧偏移

public void 多段线和直线两侧缓冲区(){List<Curve> ents1 Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines2(ents1);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//p距离double offsetDistance2 1.0…

贪心算法(常见贪心模型)

常见贪心模型 简单排序模型 最小化战斗力差距 题目分析&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e5 10;int n; int a[N];int main() {// 请在此输入您的代码cin >> n;for (int i 1;i < n;i) cin >> a[i];sort(a1,a1n);…

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述 中描述了什么是供应链中台&#xff0c;供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解&#xff0c;我会逐一针对中台…

Linux(Centos 7.6)目录结构详解

Linux(Centos 7.6)是一个操作系统&#xff0c;其核心设计理念是将一切资源抽象为文件&#xff0c;即一切皆文件。比如系统中的硬件设备硬盘、网络接口等都被视为文件。Windows系统一般是分为C、D、E盘。而Linux(Centos 7.6)是以斜线"/"作为文件系统的开始目录&#x…

transform、animation、transition?

transform、transition 和 animation 都是 CSS 属性&#xff0c;用于创建视觉效果&#xff0c;但它们的工作方式和用途不同&#xff1a; 1. transform (变换元素): 作用: transform 用于改变元素的旋转、缩放、移动、倾斜等属性&#xff0c;但不改变元素的初始状态和最终状态…