CyclicBarrier相关API
| await() 在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 |
| await(long timeout, TimeUnit unit) 在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。 |
| getNumberWaiting() 返回当前在屏障处等待的参与者数目。 |
| getParties() 返回要求启动此 barrier 的参与者数目。 |
| isBroken() 查询此屏障是否处于损坏状态。 |
| reset() 将屏障重置为其初始状态。 |
解释
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable
命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
个人白话理解:
cycliBarrier就像我们去5.1去玩摩天轮。摩天轮一次做多少人是一定的 只有在入场的人达到满额时候才开启,在旋转一定时间内所有人统一出去,等待下一波。
而cyclibarrier也是一样在执行await()后 cycliBarrier计数开始每次加1 只有在达到初始化时指定的计数之后才能执行其他方法
Demo
package test.Threae;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
static CyclicBarrier cyc= new CyclicBarrier(2);
public static void main(String[] args) {
CyclicBarrier cyc = new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println("thread end");
}
});
for (int i = 0; i < 3; i++) {
new Thread(new CycRun(i, cyc)).start();
}
}
static class CycRun implements Runnable{
private int id;
private CyclicBarrier cyc;
public CycRun(int i,CyclicBarrier cyc){
this.id=i;
this.cyc=cyc;
}
@Override
public void run() {
System.out.println("this id is"+id);
try {
cyc.await();
System.out.println("thread work end "+id);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
执行结果: