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() {
@Override
public 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
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
概述 CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点.与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyc ...
- JAVA并发,CyclicBarrier
CyclicBarrier 翻译过来叫循环栅栏.循环障碍什么的(还是有点别扭的.所以还是别翻译了,只可意会不可言传啊).它主要的方法就是一个:await().await() 方法没被调用一次,计数便会 ...
- Java并发--CountDownLatch CyclicBarrier ReentrantLock
CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.CountDownLatch使用一个数字count初始化,使 ...
- java并发:初探sleep方法
sleep与wait sleep是Thread方法,使得当前线程从运行态变为阻塞态.但它不会释放对象的锁. wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...
随机推荐
- Unable to create a debugging engine.
用QT Creator调试的时候报如下错误: Unable to create a debugging engine. QT里面打开Tools -> Options -> Kits 发现D ...
- ASP.NET Core搭建多层网站架构【9.1-使用Autofac代替原生的依赖注入】
2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1 摘要:基于ASP.NET Core ...
- 深入细枝末节,Python的字体反爬虫到底怎么一回事
内容选自 即将出版 的<Python3 反爬虫原理与绕过实战>,本次公开书稿范围为第 6 章——文本混淆反爬虫.本篇为第 6 章中的第 4 小节,其余小节将 逐步放送 . 字体反爬虫开篇概 ...
- Ubuntu18 mongodb 离线安装
环境 Ubuntu 18 + mongodb 4.0.10 1.下载版本所需库 https://www.mongodb.com/download-center/community https://re ...
- ubuntu 18 python3.6更换国内源和pip3源
1.更换国内源 查看Ubuntu18版本和codename(一定要注意codename对应) lsb_release -a No LSB modules are available. Distribu ...
- HDU4280 Island Transport
ISAP求最大流模板 #include<cstdio> #include<cstring> #include<algorithm> #include<iost ...
- vue.js ③
1.组件使用的细节点 H5编码中的规范是tr必须在tbody里所以不能直接套用<row></row>的写法,<ul>标签下支持<li>,select标签 ...
- MySQL报Too many connections
错误信息 Exception in thread "main" java.sql.SQLNonTransientConnectionException: Data source r ...
- BlockingQueue的几个实现分析
ArrayBlockingQueue 底层以数组的结构存放队列元素,容量大小不可改变. 先看下变量: items:数组,用于存放队列中的元素 takeIndex:获取元素的索引位置 putIndex: ...
- 全局注册Vue.directive
1.src目录下新建directives文件 export default { install: function(Vue, option) { // 1:el指绑定的dom元素 // 2:bindi ...