1,初始化CyclicBarrier中的各种成员变量,包括parties,count以及runnable(可选)
2,当调用await方法时,底层会检查计数器是否已经归零,如果是的话,那么久首先执行可选的runnable,接下来开始下一个generation;
3,在下一个分代中,将会重置count为parties,并且创建新的generation实例
4,同时在调用Condition的signalAll方法,唤醒所有在屏障前等待的线程,让其开始继续执行
5.如果计数器没有归零,那么当前的调用线程将会通过condition的await方法,在屏障前进行等待
6,以上所有执行流程都在lock锁的控制范围内,不会出现并发情况
public static void main(String[] args) {
CyclicBarrier cyclicBarrier=new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println("我是可选的哦");
}
});
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
try {
cyclicBarrier.await();
System.out.println("world");
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}).start();
}
}