CyclicBarrier
CyclicBarrier是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。该栅栏还可以复用。
构造函数:
public CyclicBarrier(int parties) {
this(parties,null);
}
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <=0)throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
parties:指定相互等待的线程的数量
barrierAction:当所有线程到达栅栏后优先执行的函数。是新启的一个线程
if (index ==0) {// tripped
boolean ranAction =false;
try {
final Runnable command =barrierCommand;
if (command !=null)
command.run();//是新启的一个线程 ,执行任务
ranAction =true;
nextGeneration();
return 0;
}finally {
if (!ranAction)
breakBarrier();
}
}
await():栅栏,等待
await(long timeout, TimeUnit unit)
1、保证线程安全(保证线程)。
2、获取到锁的线程,count-1,并且进入等待(condition.await() or condition.await(timeout))。
3、当count等于0的时候,会唤醒所有等待的线程。其中 nextGeneration方法可以实现屏障的循环使用:重新生成Generation对象,恢复count值
4、等待时间的参数用作condition 的await参数。