CyclicBarrier也是一种计数器,其实可以反复使用的,比如说,将计数器设置为10,那么凑齐第一批10个线程后,计数器就会清零,然后可以接着凑齐下一批10个线程。CyclicBarrier是比CountDownLatch更加强大的,CyclicBarrier可以接收一个参数作为barrierAction。所谓的barrierAction就是当计数器一次计数完毕后,会执行的动作。
CyclicBarrier的构造函数:public CyclicBarrier(int parties, Runnable barrierAction);
CyclicBarrier的主要方法:
await()方法,调用该方法的线程进入等待状态,当凑齐计数器的个数后,这些线程才会开始运行。当计数器清零后,再调用该方法就表示再次开始计数。
应用示例:
public class CyclicBarrierDemo{
public static void main(String[] args) {
CyclicBarrier cyclic=new CyclicBarrier(5, new Action());
Work work=new Work(cyclic);
ExecutorService exe=Executors.newFixedThreadPool(5);
for(int i=0; i<5; i++){
System.out.println("over!");
exe.execute(work);
}
exe.shutdown();
}
static class Work implements Runnable{
private CyclicBarrier cyclic;
public Work(CyclicBarrier cyclic){
this.cyclic=cyclic;
}
public void run() {
try {
cyclic.await();//开始计数,凑齐5个线程后会先执行一个动作,再执行线程自身的后续的操作,并且计数器清零
Thread.sleep(new Random().nextInt(2000));//模拟进行工作
System.out.println("over");
cyclic.await();//再次开始计数
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
static class Action implements Runnable{
public void run() {
System.out.println("All is over!");
}
}
}