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方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...
随机推荐
- 连接数据库报错Access denied for user 'root'@'localhost' (using password:YES)
报错信息为:pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pa ...
- maplotlib python 玩具绘图 横向纵向条状图
from matplotlib import font_manager#解决zh-han图形汉字乱码 my_font = font_manager.FontProperties(fname=" ...
- sql注入小姿势
利用/*!union*/可以绕过对union的过滤
- 探讨 Git 代码托管平台的若干问题
关于 Git 版本控制软件种类繁多,维基百科收录的最早的版本控制系统是 1972 年贝尔实验室开发的 Source Code Control System.1986 年 Concurrent Vers ...
- Unity2018编辑器脚本趟坑记录
解除预制体问题:(这个例子是解除游戏中的Canvas与Asset中的预制体的关系) if( PrefabUtility.IsAnyPrefabInstanceRoot(GameObject.Find( ...
- 使用URLConnection获取页面返回的xml数据
public static void main(String[] args) throws Exception { String path="http://flash.weather.com ...
- 吴裕雄--天生自然TensorFlow2教程:单输出感知机及其梯度
import tensorflow as tf x = tf.random.normal([1, 3]) w = tf.ones([3, 1]) b = tf.ones([1]) y = tf.con ...
- Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data
在常见业务开发中,POST请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用Postman测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-form- ...
- 【Hibernate 一对多】
OneToMany public class OneToMany { @Test public void testAdd1() { SessionFactory sessionFactory = nu ...
- mcast_unblock_source函数
#include <errno.h> #include <sys/socket.h> #define SA struct sockaddr int mcast_unblock_ ...