Java 线程并发 常用辅助类 (二) Cyclicbarrier
定义介绍:允许一组线程全部等待彼此达到共同屏障点的同步辅助。循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
A CyclicBarrier
支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。
构造方法:
Constructor and Description |
---|
CyclicBarrier(int parties) 创建一个新的 |
CyclicBarrier(int parties, Runnable barrierAction) 创建一个新的 |
所有方法接口方法具体的方法
Modifier and Type | Method and Description |
---|---|
int | await() 等待所有 parties已经在这个障碍上调用了 |
int | await(long timeout, TimeUnit unit) 等待所有 parties已经在此屏障上调用 |
int | getNumberWaiting() 返回目前正在等待障碍的各方的数量。 |
int | getParties() 返回旅行这个障碍所需的聚会数量。 |
boolean | isBroken() 查询这个障碍是否处于破碎状态。 |
void | reset() 将屏障重置为初始状态。 |
代码示例:
@Test
public void test01(){
CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{
System.out.println("召集龙珠"); //等到cyclicBarrier 七次时候执行
});
for(int i=1;i<8;i++) {
final int tmp=i;
new Thread(() -> {
System.out.println("第"+tmp+"颗龙珠");
try {
TimeUnit.SECONDS.sleep(2);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
System.out.println("等待的数量1:"+cyclicBarrier.getNumberWaiting());
System.out.println("状态1:"+ cyclicBarrier.isBroken());
}
CyclicBarrier 与 CountDownLatch 区别 很明显 ,一个是倒减 ,倒减完后可以再往下执行,另一个是阻塞,阻塞到一定限制再一起执行,另外CyclicBarrier 可以重置,而CountDownLatch 不可以。
接下来:Semaphore 辅助类