最近在看 CyclicBarrier的源码,这里先贴出个 CyclicBarrier的 demo,之后会来更新 CyclicBarrier的源码
源码真的很重要,从源码层面理解了其工作原理,不仅能加深你对并发领域组件的设计的理解,而且在实际使用时能够减少一些 "坑"
/**
* 模拟王者荣耀
*/
public class MyCyclicBarrierDemo {
public static void main(String[] args) {
String[] names = new String[]{"李白", "马可波罗", "小乔", "刘邦", "关羽"};
CyclicBarrier barrier = new CyclicBarrier(5);
ExecutorService threadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i ++) {
threadPool.execute(new Player(names[i], barrier));
}
}
static class Player implements Runnable {
public Player(String name, CyclicBarrier barrier) {
this.name = name;
this.barrier = barrier;
}
private String name;
private CyclicBarrier barrier;
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep((long) (Math.random() * 10));
System.out.println(name + ": 加载进度 100%, 等待其他玩家加载完成中...");
try {
barrier.await();
System.out.println(name + ": 发现所有英雄加载完成, 开始战斗吧");
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
李白: 加载进度 100%, 等待其他玩家加载完成中...
小乔: 加载进度 100%, 等待其他玩家加载完成中...
刘邦: 加载进度 100%, 等待其他玩家加载完成中...
马可波罗: 加载进度 100%, 等待其他玩家加载完成中...
关羽: 加载进度 100%, 等待其他玩家加载完成中...
关羽: 发现所有英雄加载完成, 开始战斗吧
李白: 发现所有英雄加载完成, 开始战斗吧
小乔: 发现所有英雄加载完成, 开始战斗吧
刘邦: 发现所有英雄加载完成, 开始战斗吧
马可波罗: 发现所有英雄加载完成, 开始战斗吧