CyclicBarrier的介绍

news/2024/11/28 5:19:10/文章来源:https://www.cnblogs.com/hld123/p/18570993

CyclicBarrier的介绍

    概要

   CyclicBarrier(循环栅栏/循环屏障)是java.util.concurrent工具类里的一个工具,它是Java提供的一种特定场景下的多线程之间进行交互的使用方法。

   CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用。

   如下图:

 

   一、案例介绍

   举个例子,比如小明,小美,小华,小丽几人终于历经多年课本出题历程,高考结束,相约一起聚餐,然而他们每个人到达约会地点的耗时都一样,有的人会早到,有的人会晚到,但是他们要都到了以后才可以决定点那些菜。

   这个时候我们就可以使用JUC包中为我们提供了一个同步工具类来模拟这类场景,CyclicBarrier,利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。这里每个人相当于一个线程,而餐厅就是 CyclicBarrier。

   介绍:CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

   CyclicBarrier字面意思是"可重复使用的栅栏",CyclicBarrier 和 CountDownLatch 很像,只是 CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)。

   二、构造函数

public CyclicBarrier(int parties) {this(parties, null);
}public CyclicBarrier(int parties, Runnable barrierAction) {if (parties <= 0) throw new IllegalArgumentException();this.parties = parties;this.count = parties;this.barrierCommand = barrierAction;
}

parties 是参与线程的个数,每个线程使用await()方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
第二个构造方法有一个 Runnable 参数,这个参数的意思是,线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。

## 3. CyclicBarrier和CountDownLatch的区别

1)CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置,可以使用多次,所以CyclicBarrier能够处理更为复杂的场景;
2)CyclicBarrier还提供了一些其他有用的方法,比如getNumberWaiting()方法可以获得CyclicBarrier阻塞的线程数量,isBroken()方法用来了解阻塞的线程是否被中断;
3)CountDownLatch允许一个或多个线程等待一组事件的产生,而CyclicBarrier用于等待其他线程运行到栅栏位置。

参考链接:https://juejin.cn/post/6977549754217529358

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eplan 2024下载与安装

1、安装包EPLAN Electric2024: 链接:https://pan.quark.cn/s/d44ddafa837a 提取码:FpKb 2、安装教程(建议关闭杀毒软件) 1) 解压下载的文件,查看文件目录2) 找到host文件并修改计算机本地host,文件位置(C:\Windows\System32\drivers\etc)3) 拖拽文件…

AI+若依

AI+若依https://www.bilibili.com/video/BV1pf421B71v/?spm_id_from=333.337.search-card.all.click&vd_source=b1acc63fa6d7d73e53111f9e1153f990若依扫盲通义灵码(AI)CRM客户关系管理系统(后台管理系统)选型与搭建:技术选型,环境搭建,框架整合(AI凉凉)设计:基…

ETL数据采集之Sqoop的安装部署及操作

ETL数据采集 数据采集也叫数据集成 ,我们常说的爬虫也是数据采集的一种方式 。 常用的数据采集工具分为两大类:离线数据采集(批量数据采集),实时数据采集(增量数据采集),这次我们分别来学习一下这俩种采集方式的常用工具 离线数据采集 常用工具有Sqoop、DataX、Kettle …

CTF学习(19)MISC(面具下的flag)

1.解压后发现为.jpg格式的文件--->使用010editor打开后搜索flag发现存在两个疑似flag文件的标识 第一处:第二处:2.在kali使用binwalk发现藏有两个文件--->爆破zip文件(无果,可能是伪加密?)分离后的文件:3.检查文件头加密部分(偶数,无加密)--->检查文件尾加密部分 09 …

差旅费报销管理信息系统进度1(2022java期末考试练习)接上题目

目前做了第一个表出差申请的增删改查项目结构mapper中放sql语句 service写函数定义 web写具体servlet操作 前端用html+jsp

2024.11.26总结

DrRatio本文于 github 博客同步更新。 A: 学生大战一个半小时未果,结束前半小时发现是打表找规律。 就是分讨一下,首先大于 \(1\) 的数不能超过两个,若有两个则其中一个必定为 \(2\),然后看一下 \(1\) 的个数是不是 \(3\) 的倍数即可。 B: 拆贡献,分为 \(u\rightarrow l…

五款GIS工具箱推荐:GISBox、Global Mapper等如何选择?

概述 GIS工具箱在地理信息数据的管理、分析和可视化中扮演着至关重要的角色。本文介绍了包括GISBox在内的五款GIS工具箱,分别是GISBox、Global Mapper、QGIS、Whitebox GAT和MapWindow GIS,并从功能特点、用户体验和应用场景等方面分析了它们的优缺点,帮助用户选择适合自身需…

TIA使用SCL写FB做交通信号灯控制练习

这个练习尝试使用SCL编程,按照第一个交通信号灯的要求写控制程序。因为我是初学者,所以做出来的东西可能不是最简洁最优的,只是当学习体验做一个记录而已。 在前面的程序基础上新建一个FB,使用SCL编程方式,先建立变量如下:写下面的SCL程序,其中TON这样的功能块通过从右边…

app搭建笔记(18)

一、app自动化测试环境和用途: 主要用于做app端UI自动化,熟悉adb命令(a表示安卓,d表示debug,b表示桥) adb是连接手机设备 二、搭建环境的工具 (1)jdk 已安装,java的一种编译器 (本地windows安装) jdk安装和配置环境变量(2)查看jdk版本如果如果配置好,就要配置…

IDEA如何整理代码格式,格式化代码,去除无效依赖,自动缩进等

前言 大家好,我是小徐啊。我们在IDEA中,经常是需要格式化代码的,这样代码才能好看一点。今天,我就来介绍下如何在IDEA中格式化代码,让代码看起来更加好看整洁一点。 如何格式化代码 首先,我们打开要格式化代码的文件。然后,鼠标右击下。然后,点击下重新格式化代码,或者…

『模拟赛』多校A层冲刺NOIP2024模拟赛26

『模拟赛记录』多校A层冲刺NOIP2024模拟赛26Rank 有点唐A. 随机游走 签。 重要的就后两句话。题意由此转化成:到每一个节点时,先后遍历其所有子节点的子树,使得 \(\sum t_i\times w_i\) 最小。 提前 dfs 一遍处理出便利完某棵子树所需要的总时间和子树总价值,容易发现对于两…

强化学习交易应用相关

FinRL尝试 这是第一个开源的金融强化学习框架,FinRL已经发展成为一个包含丰富资源的生态系统,为金融强化学习的研究和应用提供了强大的支持。 项目地址:https://github.com/AI4Finance-Foundation/FinRL个人使用体验:可能因为维护不及时,示例代码无法顺利运行,需要各种修…