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方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...
随机推荐
- excel 练习玩具统计项目组excel日报
import xlrd import xlwt import os,time import json from xlrd import xldate_as_tuple from datetime im ...
- Anniversary party POJ - 2342
题目链接 经典的树形dp,最大独立集,对于每个点就有2个状态,选/不选 设\(dp_{i,0}\)表示不选第i个,\(dp_{i,1}\)表示选第i个,容易得到其状态转移 \(dp_{i,0} = \ ...
- python学习HTML之CSS(2)
1.边框的属性设置 PS:边框的高度和宽度可以采用百分比,但是高度方向的百分比基本无用,因为基数没定,参考没意义!! 2.内边距和外边距 3.在右下角添加一个“回顶部”的标签. <div> ...
- PyQt5绘图API
PyQt5绘图API大全1.绘图API:绘制文本#1.文本 2.各种图形 3.图像#QPainter painter=QPainter() painter.begin() painter.end() ...
- Java判断对象是否为Null/空
package com.taiping.test; import java.lang.reflect.Field; import java.lang.reflect.Type; /** * <p ...
- 02-15Android学习进度报告十五
今天学习了关于ListView Item多布局的实现.感觉有点困难. 何为ListView Item多布局,打个比方,QQ这种聊天列表 代码示例如下: public class MutiLayoutA ...
- 结对编程任意Android App Demo
一.产品说明 1.编写目的:用于获取百度图标. 2.情景设计:本产品用于展示图标.随着21世纪各类元素的普及,大部分的人群想下载各类网站的图标,也为了方便用户更便捷的下载而开发的. 3.Demo主要实 ...
- 20199317 myod实验
myod实验 实验内容: 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 3 main与其他分开,制作静态库和动态库 4 编写Mak ...
- 【内容摘录自 MDN】变量作用域
有如下自定义函数:(此函数为全局函数,任何地方均可调用) function output(value) { var para = document.createElement('p'); docume ...
- 使用SQL语句还原数据库 2012.3.20
--返回由备份集内包含的数据库和日志文件列表组成的结果集. --主要获得逻辑文件名 USE master RESTORE FILELISTONLY FROM DISK = 'g:\back.Bak' ...