下面我们来说一下CyclicBarrier,我们知道,CountDownLatch是一个线程等待多个线程执行,那么CyclicBarrier是多个线程互相等待一起到达,再一起执行。CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以让一组线程达到一个屏障时被阻塞,直到最后一个线程达到屏障时,所以被阻塞的线程才能继续执行。下面我们就来分析一下CyclicBarrier
先来看一下CyclicBarrier这个类
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;
}
CyclicBarrier的构造方法有2个参数,一个是线程数量parties,一个是屏障打开后的操作barrierAction。
CyclicBarrier的实现基于ReentrantLock,下面来看一下具体的实现,先来看一下await方法
public int await() throws InterruptedException, BrokenBarrierException {
try {
return dowait(false, 0L);
} catch (TimeoutException toe) {
throw new Error(toe); // cannot happen
}
}
再到dowait方法
if (g.broken)
throw new BrokenBarrierException();
if (Thread.interrupted()) {
breakBarrier();
throw new InterruptedException();
}
int index = --count;
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();
}
}
再到breakBarrier方法
private void breakBarrier() {
generation.broken = true;
count = parties;
trip.signalAll();
}
每次调用await方法,count减1,当count=0时,调用signalAll方法唤醒所有线程继续执行。
CyclicBarrier的分析就到这里了。
网友评论