循环栅栏的意思,除了能实现CountDownLatch的作用外,更加强大的地方在于循环。run方法有几个await,就循环几次。把所有的await凑齐,就是一次循环结束。新增加的特性是每次循环一遍,就会执行我们指定的一个线程,这个Runnable对象从CyclicBarrier构造函数传进去。
下面的代码模拟了这样一个场景,长官集合队伍,把人集合完毕后,下命令干活。都干完活后,下命令收队。
public class CyclicBarrierTest {
public static void main(String[] args) {
int threadNum = 3;
CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Leader());
for (int i = 0; i <threadNum;i++){
new Thread(new Soldier("soldier"+i,cyclicBarrier)).start();
}
}
}
class Soldier implements Runnable {
private String soldierName;
private CyclicBarrier cyclicBarrier;
public Soldier(String soldierName, CyclicBarrier cyclicBarrier) {
this.soldierName = soldierName;
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
try {
System.out.println(soldierName + "来集合");
cyclicBarrier.await();
doWork();
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
private void doWork() {
System.out.println(soldierName + " 干完活了");
}
}
class Leader implements Runnable {
private boolean flag = false;
public void run() {
if (!flag) {
System.out.println("队伍集合完毕,我命令,开始干活");
flag = true;
} else {
System.out.println("士兵工作完毕了,我命令,收队");
}
}
}