当前位置:首页 > Java技术 > Java多线程CyclicBarrier学习

Java多线程CyclicBarrier学习

2022年09月17日 14:53:19Java技术10

Java多线程CyclicBarrier学习

 

      CyclicBarrier是多线程并发控制实用工具

 

  • CyclicBarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。
  • await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
  • CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
  • CyclicBarrier可以接收一个参数作为barrierAction,就是当计数器一次计算完成后,程序会执行的动作。

 

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 
 * @author InJavaWeTrust
 *
 */
public class Orange {
	
	public static class PickOrange implements Runnable {
		
		private int i;
		private CyclicBarrier cb;
		
		public PickOrange(int i, CyclicBarrier cb) {
			this.i = i;
			this.cb = cb;
		}
		
		public void run() {
			try {
				pick();
				cb.await(); // 等待所有橘子采摘完毕
				box();
				cb.await(); // 等待所有橘子装箱完毕
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
		}
		
		public void pick() {
			System.out.println("采摘第" + i +"个橘子完成!");
		}
		
		public void box() {
			System.out.println("第" + i + "个橘子装箱完成!");
		}
	}
	
	public static void main(String[] args) {
		CyclicBarrier cb = new CyclicBarrier(5);
		ExecutorService exec = Executors.newFixedThreadPool(5);
		for (int i = 1; i <= 5; i++) {
			exec.submit(new Thread(new PickOrange(i, cb)));
		}
		exec.shutdown();
	}

}

       结果:

采摘第2个橘子完成!
采摘第1个橘子完成!
采摘第5个橘子完成!
采摘第4个橘子完成!
采摘第3个橘子完成!
第3个橘子装箱完成!
第2个橘子装箱完成!
第1个橘子装箱完成!
第5个橘子装箱完成!
第4个橘子装箱完成!

 

作者:托马斯小火车喷雾又喷烟,一直喷,喷喷喷.
来源链接:https://blog.csdn.net/InJavaWeTrust/article/details/101063733

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42563.html

分享给朋友:

“Java多线程CyclicBarrier学习” 的相关文章

Java空指针异常解决java.lang.NullPointerException解决心得

Java空指针异常解决java.lang.NullPointerException解决心得

今天做课设的时候运行程序报出以下错误 java.lang.NullPointerException 首先要理解的是此错误并不会在 程序中报错,只会在运行的时候报错。 是由于某个参数(集合,数组等数据)可能出现一个null值而导致后面的程序不能运行时...

深入理解 Java 并发锁

深入理解 Java 并发锁

📦 本文以及示例源码已归档在 javacore 一、并发锁简介 确保线程安全最常见的做法是利用锁机制(Lock、sychronized)来对共享数据做互斥同步,这样在同一个时刻,只有一个线程可以执行某个方法或者某个代码块,那么操作必然是原子性的,线程安全的...

Java 并发核心机制

Java 并发核心机制

📦 本文以及示例源码已归档在 javacore 一、J.U.C 简介 Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。...

java计数循环及小技巧

要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) { // TODO Auto-generated metho...

java数数字及while和do while 的使用,以及程序的调试与验证

while的条件是在进入循环体之前判断的,执行完一轮循环之后,会再回到循环开始的地方再次判断条件,而不会在循环体中随时判断条件 1.while语句是当条件满足时不断的执行循环体内语句。 2.会提前判断是否满足条件,所以有可能一次也没有执行。 3.条件成立...

Java开发手册精华总结

Java开发手册精华总结

阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。 -- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelCase 风格,比如 DO/BO/VO...

JAVA UUID 生成唯一标识

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want 需求     项目在设计表的时候,要处理并发多...

Java实现ModbusTCP通信

Java实现ModbusTCP通信

使用ModbusTCP实现和硬件设备通信 有问题可以私信和评论,看到会回复。 一个项目,需要用Java实现使用ModbusTCP和硬件设备通信 视频地址:https://www.bilibili.com/video/BV1cz4y1R7cg...

java高级

java高级

  Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。下...

java 实现图片压缩

转载https://www.cnblogs.com/strongmore/p/14158639.html 添加依赖 <dependency> <groupId>net.coobird</groupId> <artifa...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。