【高并发系列】14、循环栅栏 CyclicBarrier

【高并发】JUC中的循环栅栏CyclicBarrier的6种使用场景 JUC中的循环栅栏CyclicBarrier的6种使用场景。 CyclicBarrier通常称为循环屏障。它和CountDownLatch很相似,都可以使线程先等待然后再执行。不过CountDownLatch是使一批线程等待另一批线程执行完后再执行;而CyclicBarrier只是使等待的线程达到一定数目后再让它们继续执行。故而CyclicBarrier内部也有一个计数器,计数器的初始值在创建对象时通过构造参数指定,如下所示: 。除此之外,CyclicB 阅读详情

java.util.concurrent.CyclicBarrier与CountDownLatch非常类似,也可以实现线程间的计数等待,但其功能更为复杂强大;

Barrier意为栅栏,障碍物,阻止线程继续执行,要求在栅栏外等待;

Cyclic意为循环,这个计数器可以循环使用;

示例:司令要求10个士兵一起去完成一项任务;首先要求10个士兵集合报到,然后一起去执行任务,等10个士兵把各自任务都执行完了,司令才能宣布任务完成!

public class CyclicBarrierDemo {
	public static class Soldier implements Runnable {
		private String name;
		private CyclicBarrier cyclic;
		public Soldier(CyclicBarrier cyclic, String name) {
			this.cyclic = cyclic;
			this.name = name;
		}
		@Override
		public void run() {
			try {
				// 等待所有士兵到齐
				cyclic.await();
				doWork();
				// 等待所有士兵完成工作
				cyclic.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
		private void doWork() {
			try {
				TimeUnit.SECONDS.sleep(Math.abs(new Random().nextInt(9)));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(name + "'s work is done.");
		}
	}
	public static class BarrierRun implements Runnable {
		private boolean flag;
		int n;
		public BarrierRun(boolean flag, int n) {
			this.flag = flag;
			this.n = n;
		}
		@Override
		public void run() {
			if (flag) {
				System.out.println("The commander: There are " + n + " soldiers complete the task.");
			} else {
				System.out.println("The commander: There are " + n + " soldiers get together.");
				flag = true;
			}
		}
	}
	public static void main(String[] args) {
		final int n = 10;
		Thread[] allSoldiers = new Thread[n];
		boolean flag = false;
		CyclicBarrier cyclic = new CyclicBarrier(n, new BarrierRun(flag, n));
		System.out.println("Get together now!");
		for (int i = 0; i < n; i++) {
			String soldierName = "soldier" + i;
			System.out.println(soldierName + " arrivals.");
			allSoldiers[i] = new Thread(new Soldier(cyclic, soldierName));
			allSoldiers[i].start();
			//if(i == 5) {
			//	allSoldiers[i].interrupt();
			//}
		}
	}
}

每一个士兵线程都会执行Soldier类中的run()方法;第一个cyclic.await()方法,每一个士兵线程都会等待,直到10个士兵集合完毕,才会继续向下执行;

集合完毕意味着CyclicBarrier的一次计数完成,当再一次调用await()方法时,会进行下一次计数,即等10个士兵线程都完成各自任务后集合,司令宣布任务完成;

每一次计数完成后都会调用BarrierRun类中的run()方法;

把main方法中注释掉的代码恢复,会得到1个java.lang.InterruptedException和9个java.util.concurrent.BrokenBarrierException;其中InterruptedException是被中断线程抛出的,而BrokenBarrierException则是在等待当前CyclicBarrier上的线程抛出的,可以避免9个线程进行永久的、无谓的等待;

31、自然语言生成中的流畅度评估 本博客探讨了自然语言生成(NLG)中流畅度评估的重要性和方法。文章详细介绍了流畅度的定义及其影响因素,包括句法结构、词汇选择、语义一致性和段落组织。同时,讨论了自动评估和人工评估两种主要方法,并以机器翻译、自动摘要和对话系统为例分析了流畅度评估的应用场景。最后,文章提出了提升流畅度的技术策略以及未来研究方向,为相关领域的研究者和开发者提供了有价值的参考。 阅读详情

相关推荐

cesium 高程数据使用

cesium 高程数据使用高程数据下载高程数据切片简单数据服务 高程数据下载 使用地理空间数据云平台免费提供的高程数据。地理空间云平台 点击列表中的下载得到数据压缩包。例如:ASTGTM2_N22E114.zip 高程数据切片 使用cesium实验室工具对下载得到的压缩包进行切片。cesium实验室 切片得到的文件夹目录。 简单数据服务 使用nodejs的koa启动简单的资源服务。koajs 项目根目录新建data文件夹,在新建dem文件夹放高程数据。 注意目录自行更换,这里是./data/dem

哎哟这个凉白白的博客 1811

08.073-cyclic barrier 循环 栅栏

是一个强大的工具,用于协调多个线程在特定时刻同步执行,尤其适用于多线程并行任务需要等待其他线程完成某个阶段后才继续执行的场景。它不仅可以用于基本的线程同步,还可以提供额外的回调功能,增加其灵活性。循环栅栏 是 倒计次数门栓 的补充和 CountDownLatch都是用于多线程同步的工具类,但它们各自的设计和使用场景有所不同,CyclicBarrier可以看作是 CountDownLatch的补充,适用于不同的需求。

qq_41577703的博客 1060

Windows10内核逆向-2-KiSystemCall64的调用流程剖析

本文深入剖析了Windows 10 x64系统中KiSystemCall64函数的完整调用流程。从用户态触发syscall指令开始,详细讲解了如何通过swapgs切换内核栈、构建KTRAP_FRAME陷阱帧、进行SMAP/CFG等安全检查,到最终通过SSDT寻址并执行目标系统服务的全过程,揭示了系统调用从Ring 3到Ring 0切换的核心机制与安全设计。

weixin_29209805的博客 82

java循环栅栏CyclicBarrier 使用详解

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

cputao的博客 3468

【WiFi软件开发】IOCTL和Netlink----用户空间和内核空间交互的两种方式

linux开发中通常会涉及用户空间和内核模块的交互。本文介绍了两种典型的用户空间和内核模块通信方式:ioctl和netlink

liuwe1ye的博客 2349

将3DMax编辑的动画,导入给已经绑定蒙皮好的模型给Unity使用

现在程序猿想做独立游戏,即容易,也难。 说容易,引擎越来越傻瓜化。 说难,到哪去找靠谱的美术? 好在伟大的AssetStore(还有淘宝上)有大批不赖的资源可以用。 现成的模型,是好,但是,没有配套的动作,却是一件让人头疼的事情,即使用IK动画,也不能完美的弥补这一缺陷。 虽然Unity具备 retargeting 功能,但是,也不是万能的,很多情况下,非标准的骨骼会导致

正经的时候都在打游戏 1万+

多线程之循环栅栏CyclicBarrier及原理

CyclicBarrier它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。比如将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归0,然后接着凑齐下一批10个线程,这就是循环栅栏内在的含义。

qq_31957747的博客 3033

从零到一:EHB-电机复合制动系统的Simulink仿真实战指南

本文详细介绍了EHB-电机复合制动系统在纯电动汽车中的Simulink仿真实战指南。通过系统概述、建模核心模块解析、控制策略开发及典型问题排查,帮助读者掌握从零到一的开发流程。重点讲解了液压子系统建模、电机再生制动模型及整车动力学集成,为开发者提供了一套完整的解决方案。

hh234的博客 1008

循环栅栏CyclicBarrier的使用及原理

1、使用 直接await即可。 //指定等待数量 public CyclicBarrier(int parties) //等待,触发归0则往下走 int await() 2、原理 使用ReentrantLock及相应Condition实现等待/阻塞/唤醒。 主要实现方法为 private int dowait(boolean timed, long nanos) ...

永远向前 1064

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 36

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 105

阿里面试居然跟我扯了半小时的CyclicBarrier

一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满Logo的Mac向我走来,看着稀少的头发,我心想着肯定是顶级技术大牛吧!但是我也是一个才华横溢的人,稳住我们能赢。

万猫学社 1万+

1、硬件工程师笔面试真题汇总(2025版本)

答:按照使用习惯,电源指示灯用红色,信号指示灯用绿色这两种颜色的LED 灯技术最成熟,价格最便宜通孔是贯穿整个PCB 的过孔盲孔是从PCB 表层连接到内层的过孔埋孔是埋在PCB 内层的过孔。大多数PCB厂家的加工能力是这样的:大于等于8mil 的过孔可以做机械孔小于等于6mil 的过孔需要做激光孔对小于等于6mil 的微型孔,在钻孔空间不够时,允许一部分过打在PCB 焊盘上。

XU157303764的博客 2万+

CyclicBarrier 循环栅栏源码深度解析

答案CyclicBarrier(循环栅栏)是 Java 并发包中的一个同步辅助工具,它允许一组线程相互等待,直到所有线程都到达一个公共的屏障点。核心特性循环使用:CyclicBarrier 可以重复使用,每次所有线程到达屏障后可以重新开始相互等待:多个线程相互等待,而不是一个线程等待其他线程屏障动作:支持可选的屏障动作,在最后一个线程到达后、所有线程释放前执行代际管理:使用 Generation 机制管理不同的使用周期异常处理。

先度过菜鸟阶段 972

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java并发之(4):Semaphore信号量、CounDownLatch计数锁存器和CyclicBarrier循环栅栏

简介 java.util.concurrent包是Java 5的一个重大改进,java.util.concurrent包提供了多种线程间同步和通信的机制,比如Executors, Queues, Timing, Synchronizers和Concurrent Collections等。与synchronized关键字和Object.notify()等方法相比,这些类和方法的抽象层次都较...

weixin_33922672的博客 260

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

理解高并发(14).到齐后才能开干_cyclicBarrier

概念 循环栅栏。工作线程必须等待其它线程都到达后才能够继续。 这就好比500米短跑比赛, 3跑道必须等到3人都到齐后才能开始赛跑。 与CountDownLatch区别 CountDownLatch 的使用场景更多的是侧重于主线程-从线程协调工作 而CyclicBarrier侧重的是多个从线程之间的协调工作 示例代码 5个线程都到齐后才会开始工作。 public c

297

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java高并发系列

获取线程执行结果:https://blog.youkuaiyun.com/likun557/article/details/100070370 java高并发系列目录: 第1天:必须知道的几个概念:https://mp.weixin.qq.com/s?__biz=MzA5MTkxMDQ4MQ==&mid=2648933019&idx=1&sn=3455877c451de9c61f839...

weixin_43719015的博客 203

戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法

戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法   CyclicBarrier是JDK 1.5concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类。我们先来...

weixin_30470857的博客 133

CountDownLatch(倒计时器)、CyclicBarrier(循环栅栏)

CountDownLatch(): CountDownLatch是一个非常实用的多线程控制工具类,这个工具通常用来控制线程等待,它可以让某一个线程等到倒计时结束,再开始执行。 CountDownLatch的构造函数接收一个整数为参数,即当前这个计数器的计数个数。 public CountDownLatch(int count) 下面演示下CountDownLatch的使用: ...

weixin_30677617的博客 205

Java并发编程(四):CyclicBarrier原理详解

1 引言 少侠在之前的一篇博客介绍闭锁CountDownLatch的时候有提到CyclicBarrier,那么它究竟是什么呢?本篇文章和你们一起揭开它神秘的面纱。 关于CountDownLatch的原理和用法可以阅读下篇,附传送门↓: Java并发编程(三):CountDownLatch(闭锁)原理及最佳实践 从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏...

少侠露飞的学习笔记 363

JUC-并发编程14-CyclicBarrier栅栏

1、简介 CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。 ...

qq_29434541的博客 287

(必备技能)玩转java高并发系列,估计有50篇,已连载17篇

java高并发系列 java高并发系列 - 第1天:必须知道的几个概念 java高并发系列 - 第2天:并发级别 java高并发系列 - 第3天:有关并行的两个重要定律 java高并发系列 - 第4天:JMM相关的一些概念 java高并发系列 - 第5天:深入理解进程和线程 java高并发系列 - 第6天:线程的基本操作 java高并发系列 - 第7天:volatile与Java内存模...

a502297457760202的博客 404

【Java并发】CyclicBarrier

CyclicBarrier从字面意思上来看,循环栅栏,这篇文章就来分析下是到底是如何实现循环和栅栏的。 属性 private final ReentrantLock lock = new ReentrantLock(); /** Condition to wait on until tripped */ private final Condition trip = lock.newCo...

Brain_L的博客 186

JAVA并发,CyclicBarrier

CyclicBarrier 翻译过来叫循环栅栏、循环障碍什么的(还是有点别扭的。所以还是别翻译了,只可意会不可言传啊)。它主要的方法就是一个:await()。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。在这之后,如果再次调用 await() 方法,计数就又会变成 N-1,新一轮重新开始,...

weixin_34075551的博客 75

JDK并发包--CountDownLatch,CyclicBarrier

CountDownLatch: 可以理解为一个计数器,这个工具通常是用来控制线程等待的,比如5个人约打球,只有等人齐了之后才能开始,这种情况适合使用CountDownLatch public class CountDownLatchDemo implements Runnable{ static final CountDownLatch end = new Coun...

144

并发编程回顾:循环阻断器CyclicBarrier

原先多线程并发编程的学习笔记和代码整理一下贴上来。 --------------------------------- 循环阻断器CyclicBarrier CyclicBarrier(循环栅栏):没有找到合适的名字,这里自己翻译成循环阻断器。 感觉这个工具类其实和CountDownLatch很像,不同的是CountDownLatch是等待一组其它线程,CyclicBarrier是一组...

235
上一篇: 【高并发系列】13、倒计数器 CountDownLatch
下一篇: 【高并发系列】15、线程阻塞工具类 LockSupport
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值