CyclicBarrier (循环栅栏)
日常记录
文档解释:
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则用 InterruptedException)以反常的方式离开。
内存一致性效果:线程中调用 await() 之前的操作 happen-before 那些是屏障操作的一部份的操作,后者依次 happen-before 紧跟在从另一个线程中对应 await() 成功返回的操作。
构造方法
- CyclicBarrier(int parties)
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。 - CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。
方法:
- int await()
在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 - int await(long timeout, TimeUnit unit)
在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 - int getNumberWaiting()
返回当前在屏障处等待的参与者数目。 - int getParties()
返回要求启动此 barrier 的参与者数目。 - boolean isBroken()
查询此屏障是否处于损坏状态。 - void reset()
将屏障重置为其初始状态。
import java.util.concurrent.CyclicBarrier;
/**
* 循环栅栏:CyclicBarrier
* CyclicBarrier(int parties, Runnable barrierAction)
* 解释:当一组线程中的线程数量,没有达到CyclicBarrier中parties的值时,barrierAction的程序不会被执行
* 如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException
* 方法:
* await():在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待
* getNumberWaiting():返回当前在屏障处等待的参与者数目
*
* 最优解释:
* 当线程数等于循环栅栏值时,才会,执行await()方法,如果线程数,不等于循环栅栏值
* ,那么每个调用cyclicBarrier.await()方法的线程,将处于,堵塞的等待,执行状态
* ,等待调用cyclicBarrier.await()方法的线程数
* ,等于,循环栅栏值,那么才会执行await()方法,
* ,await()方法,执行之后,才会执行CyclicBarrier对象中Runnable接口中的程序
* ,如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException
*
*/
public class CyclicBarrierUse {
private static final Integer NUMBER=7;
public static void main(String[] args) {
//定义循环栅栏中(线程)参与者的数量,等于该值,执行await()方法之后,函数接口中程序,才会执行
CyclicBarrier cyclicBarrier=new CyclicBarrier(NUMBER,()->{
System.out.println("所有线程,执行完成");
});
for (int i = 1; i <=7 ; i++) {
new Thread((
)->{
try {
System.out.println("当前线程:"+Thread.currentThread().getName());
/*
当线程数等于循环栅栏值时,才会,执行await()方法,如果线程数,不等于循环栅栏值
,那么每个调用cyclicBarrier.await()方法的线程,将处于,堵塞的等待,执行状态
,等待调用cyclicBarrier.await()方法的线程数
,等于,循环栅栏值,那么才会执行await()方法,
,await()方法,执行之后,才会执行CyclicBarrier对象中Runnable接口中的程序
,如果执行中程序异常,那么所有调用await()方法的线程,都会同时被中断,并且提示:InterruptedException
*/
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
},"线程:"+String.valueOf(i)).start();
}
}
}