CyclicBarrier 循环栅栏
CyclicBarrier 相对比CoundDownLatch强大且复杂
下面模拟士兵集合、执行任务等操作
Soldier - 士兵
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 模块:【CyclicBarrier - 士兵】
* <p>
* 开发: Bruce.Liu By 2018/9/3 下午8:54 Create
*/
public class Soldier implements Runnable {
//定义名称
private String soldierName;
private final CyclicBarrier cyclic;
/**
* 构造函数
*/
public Soldier(CyclicBarrier cyclic, String soldierName) {
this.cyclic = cyclic;
this.soldierName = soldierName;
}
@Override
public void run() {
try {
//执行阻塞等待,等所有人到期
cyclic.await();
//所有人到齐后开始执行任务
doWork();
//执行阻塞等待,等待所有人执行任务完成
cyclic.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
/**
* 士兵开始执行任务
*/
void doWork() {
try {
Thread.sleep(Math.abs(new Random().nextInt() % 10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println(soldierName + " - 任务执行完成!");
}
}
BarrierRun - 司令
CyclicBarrier 可以接首一个参数作为barrier,这里即当前定义的BarrierRun,
每当barrier计数器循环一次完成(例10个完成后)后会执行,
可以参考执行结果。
/**
* 模块:【CyclicBarrier - 司令】
* <p>
* 开发: Bruce.Liu By 2018/9/3 下午9:04 Create
*/
public class BarrierRun implements Runnable {
boolean flag ;
Integer n ;
public BarrierRun(boolean flag, Integer n) {
this.flag = flag;
this.n = n;
}
@Override
public void run() {
if(flag){
System.err.println("司令:【士兵"+n+"个,任务完成!】");
} else {
System.err.println("司令:【士兵"+n+"个,集合完毕!】");
flag = true;
}
}
}
Demo - 测试
/**
* 模块:【CyclicBarrier 循环栅栏】
* <p>
* 开发: Bruce.Liu By 2018/9/3 下午8:43 Create
*/
public class CyclicBarrierDemo {
public static void main(String[] args) {
boolean flag = false;
final int n = 10 ;
Thread [] ts = new Thread[n];
CyclicBarrier cyclic = new CyclicBarrier(n,new BarrierRun(flag,n));
System.err.println("队伍集合!");
for(int i = 0 ; i < n; ++i){
System.err.println("士兵:"+i+"报道!");
ts[i] = new Thread(new Soldier(cyclic,"士兵:"+i));
ts[i].start();
}
}
}
执行结果
队伍集合!
士兵:0报道!
士兵:1报道!
士兵:2报道!
士兵:3报道!
士兵:4报道!
士兵:5报道!
士兵:6报道!
士兵:7报道!
士兵:8报道!
士兵:9报道!
司令:【士兵10个,集合完毕!】
士兵:4 - 任务执行完成!
士兵:0 - 任务执行完成!
士兵:9 - 任务执行完成!
士兵:1 - 任务执行完成!
士兵:8 - 任务执行完成!
士兵:3 - 任务执行完成!
士兵:2 - 任务执行完成!
士兵:7 - 任务执行完成!
士兵:6 - 任务执行完成!
士兵:5 - 任务执行完成!
司令:【士兵10个,任务完成!】
参考:《实战 Java 高并发程序设计》这本书。