CyclicBarrier同样是一个控制程序并发流程的类。它允许一组线程相互等待,直到到达某个公共的屏障点 Barrier point。在一组固定大小的线程的程序中,这些线程可能需要不时的相互等待。这时就需要用到CyclicBarrier。这也是和CountDownLatch的区别所在。CountDownLatch可以在一个点等待所有线程的返回,但是当count减为0的时候,值是不能重置的。而这个barrier
在释放等待线程以后可以重新使用。所以我们把这个叫做可以循环的barrier。
CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(在释放所有线程之前),该命令只在每个屏障点运行一次。
public class Test {
private int threadCount;
private CyclicBarrier barrier;
private int loopCount = 10;
public Test(int count){
threadCount=count;
barrier = new CyclicBarrier(count,new Runnable(){
public void run(){
System.out.println("through barrier!");
}
});
for (int i=0; i< threadCount;i++){
Thread thread = new Thread("thread"+i){
public void run(){
for(int j=0; j<loopCount;j++){
System.out.println(currentThread().getName()+" is running "+j+"times");
try{
barrier.await();
}catch(Exception e){
e.printStackTrace();
}
}
}
};
thread.start();
}
}
public static void main(String args[]){
Test t = new Test(3);
}
}
public CyclicBarrier(int parties,
Runnable barrierAction) // 创建一个信的CyclicBarrier, 它将在给定数量的参与者处于等待状态的时候启动, 并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。
barrierAction:启动barrier时执行的命令