CountDownLatch 的增强版
示例:游戏中有多个关卡
package com.yqzl.mybatis.test.thread.demo01;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @description:
* @author: YqZhilan
* @date: 2020-07-16
*/
public class CyclicBarrierDemo {
static class PreTaskThread implements Runnable {
private String task;
private CyclicBarrier cyclicBarrier;
public PreTaskThread(String task, CyclicBarrier cyclicBarrier) {
this.task = task;
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
for (int i = 0; i < 4; i++) {
Random random = new Random();
try {
Thread.sleep(random.nextInt(1000));
System.out.println(String.format("关卡 %d 的任务 %s 完成", i, task));
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
cyclicBarrier.reset();
}
}
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3, ()->{
System.out.println("本关卡所有的前置任务完成,开始游戏... ...");
});
new Thread(new PreTaskThread("加载地图数据", cyclicBarrier)).start();
new Thread(new PreTaskThread("加载人物模型", cyclicBarrier)).start();
new Thread(new PreTaskThread("加载背景音乐", cyclicBarrier)).start();
}
}
}
返回结果:
关卡 0 的任务 加载背景音乐 完成
关卡 0 的任务 加载人物模型 完成
关卡 0 的任务 加载地图数据 完成
本关卡所有的前置任务完成,开始游戏... ...
关卡 1 的任务 加载人物模型 完成
关卡 1 的任务 加载背景音乐 完成
关卡 1 的任务 加载地图数据 完成
本关卡所有的前置任务完成,开始游戏... ...
关卡 2 的任务 加载人物模型 完成
关卡 2 的任务 加载背景音乐 完成
关卡 2 的任务 加载地图数据 完成
本关卡所有的前置任务完成,开始游戏... ...
关卡 3 的任务 加载地图数据 完成
关卡 3 的任务 加载人物模型 完成
关卡 3 的任务 加载背景音乐 完成
本关卡所有的前置任务完成,开始游戏... ...