循环栅栏,一个可以循环使用的计数器(CountDownLatch)?
- CyclicBarrier(int parties, Runnable barrierAction);parties:计数器大小,barrierAction:回调方法
- await(); 每调用一次计数器减1,计数器等于0时如果构造函数使用了barrierAction了会执行这个回调方法
本例中循环使用了2次cyclic.await();用法还不是很清楚,先记录记录
public class CyclicBarrierDemo {
public static class Solider implements Runnable{
private String soldier;
private CyclicBarrier cyclic;
public Solider(String soldier, CyclicBarrier cyclic) {
this.soldier = soldier;
this.cyclic = cyclic;
}
@Override
public void run() {
try {
cyclic.await();
doWork();
cyclic.await();
} catch (Exception e) {
// TODO: handle exception
}
}
private void doWork() throws InterruptedException {
Thread.sleep(1500);
System.out.println(Thread.currentThread().getName()+":任务完成");
}
}
public static class BarrierRun implements Runnable{
int n;
boolean flag;
public BarrierRun(int n, boolean flag) {
this.n = n;
this.flag = flag;
}
@Override
public void run() {
if(flag){
System.out.println(n+" - 任务完成!");
}else{
System.out.println(n+" - 集合完毕");
flag=true;
}
}
}
public static void main(String[] args) throws InterruptedException {
int n=10;
boolean flag=false;
Thread []soliders=new Thread[n];
BarrierRun barrierRun = new BarrierRun(n,flag);
CyclicBarrier cyclic=new CyclicBarrier(n,barrierRun);
System.out.println("-----");
for (int i = 0; i < soliders.length; i++) {
System.out.println(i+" - 报道");
soliders[i]=new Thread(new Solider(i +"号", cyclic));
soliders[i].start();
}
}
}