java并发初探CyclicBarrier
java并发初探CyclicBarrier
CyclicBarrier的作用
CyclicBarrier,“循环屏障”的作用就是一系列的线程等待直至达到屏障的“瓶颈点”。
具体的使用就是就是一些列的线程调用CyclicBarrier得await()方法进入等待,直至达到
CyclicBarrier设置的barrier size,其他的线程会继续运行。
/*** A synchronization aid that allows a set of threads to all wait for* each other to reach a common barrier point. CyclicBarriers are* useful in programs involving a fixed sized party of threads that* must occasionally wait for each other. The barrier is called* <em>cyclic</em> because it can be re-used after the waiting threads* are released.*/
CyclicBarrier源码
成员变量
/** The lock for guarding barrier entry */private final ReentrantLock lock = new ReentrantLock();/** Condition to wait on until tripped */private final Condition trip = lock.newCondition();/** The number of parties */private final int parties;/* The command to run when tripped */private final Runnable barrierCommand;/** The current generation */private Generation generation = new Generation();
构造器
public CyclicBarrier(int parties, Runnable barrierAction) {if (parties <= 0) throw new IllegalArgumentException();this.parties = parties;this.count = parties;this.barrierCommand = barrierAction;}public CyclicBarrier(int parties) {this(parties, null);}
例子
package com.java.javabase.thread.base.concurrent.lock;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** @author*/
@Slf4j
public class CyclicBarrierTest {public static int size = 5;private static CyclicBarrier cyclicBarrier = new CyclicBarrier(size, () -> log.info("thread :{} run after barrier broken", Thread.currentThread().getName()));public static void main(String[] args) {for (int i = 0; i < size; i++) {new Thread() {@Overridepublic void run() {try {log.info("thread : {}, begin", Thread.currentThread().getName());cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}log.info("thread : {}, end", Thread.currentThread().getName());}}.start();}}
}
例子结果
2019-08-12 11:04:07,511 [Thread-0] INFO CyclicBarrierTest - thread : Thread-0, begin
2019-08-12 11:04:07,511 [Thread-2] INFO CyclicBarrierTest - thread : Thread-2, begin
2019-08-12 11:04:07,511 [Thread-4] INFO CyclicBarrierTest - thread : Thread-4, begin
2019-08-12 11:04:07,511 [Thread-1] INFO CyclicBarrierTest - thread : Thread-1, begin
2019-08-12 11:04:07,511 [Thread-3] INFO CyclicBarrierTest - thread : Thread-3, begin
2019-08-12 11:04:07,511 [Thread-3] INFO CyclicBarrierTest - thread :Thread-3 run after barrier broken
2019-08-12 11:04:07,511 [Thread-3] INFO CyclicBarrierTest - thread : Thread-3, end
2019-08-12 11:04:07,511 [Thread-0] INFO CyclicBarrierTest - thread : Thread-0, end
2019-08-12 11:04:07,511 [Thread-2] INFO CyclicBarrierTest - thread : Thread-2, end
2019-08-12 11:04:07,511 [Thread-4] INFO CyclicBarrierTest - thread : Thread-4, end
2019-08-12 11:04:07,511 [Thread-1] INFO CyclicBarrierTest - thread : Thread-1, end
转载于:https://www.cnblogs.com/JuncaiF/p/11338669.html
java并发初探CyclicBarrier相关推荐
- java并发初探ConcurrentSkipListMap
java并发初探ConcurrentSkipListMap ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了 ...
- java并发初探ConcurrentHashMap
java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...
- java并发初探ThreadPoolExecutor拒绝策略
java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...
- java并发初探CountDownLatch
java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...
- java并发初探ReentrantWriteReadLock
java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...
- Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)
什么是CyclicBarrier? CyclicBarrie和上一篇中讲到CountDownLatch很类似,它能阻塞一组线程直到某个事件的发生. 栅栏与闭锁的关键区别在于:所有必须同时到达栅栏位置才 ...
- Java并发编程: CyclicBarrier让多线程齐步走
以前在<<编写高质量代码-改善Java程序的151个建议>>一书中看到有一节的标题是"CyclicBarrier让多线程齐步走",觉得这标题挺不错的,所以在 ...
- Java 并发专题 CyclicBarrier 打造一个安全的门禁系统
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 继续并发专题~ 这 ...
- java并发:初探sleep方法
sleep与wait sleep是Thread方法,使得当前线程从运行态变为阻塞态.但它不会释放对象的锁. wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...
最新文章
- neutron linux网络命令,OpenStack Neutron网络组件介绍(重要)
- Windows:利用各种小工具查看自己电脑上的CPUGPU型号、个数、详细参数等不同方法的详细攻略
- java软件字如何放大_放大Java Swing应用程序
- React向对象数组进行赋值
- 蓝桥杯单片机stc15f2k60s2 中断函数代码模板注释
- 几台pc打造超级计算机,324台Mac Pro打造超级计算机
- win10调节屏幕分辨率导致黑屏
- oracle 用户创建日期,oracle限制一个用户空闲时间
- 关于jquery基本过滤器中:eq()无法传变量的问题
- 关于System.FormatException异常
- java新知识系列 六
- Confluence 6 针对大数据量备份
- 贝叶斯网络是神经网络吗,贝叶斯网络和神经网络
- 中公计算机岗位知识与技能,知识与技能的分类
- fan4801开关电源原理图_开关电源各模块原理实图讲解
- java反向查找dns_windows – 反向DNS查找
- c语言用中括号括起来的变量,用大括号将寄存器名括起来是什么意思?
- 【原创】随手记下-电脑版微信双开
- 下个五年,跨境支付的变数在哪里?
- java找不到的模板_java – 在当前主题中找不到样式’coordinat...
热门文章
- flutter 动画展开菜单_Flutter ExpansionPanel 超级实用展开控件
- 【APIO2009-3】抢掠计划
- 技术文档(3)--查看和修改Linux服务器的时区和时间
- SpannableString与SpannableStringBuilder使用
- TestNG – Dependency Test
- OK6410裸机调试
- 基于Windows8与Visual Studio2012开发内核隐藏注册表
- asterisk 常用命令
- linux 例行性工作,鳥哥的 Linux 私房菜
- β射线与哪些物质可产生较高的韧致辐射_什么是α射线、β射线、γ射线