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 的任務 加載背景音樂 完成
本關卡所有的前置任務完成,開始遊戲... ...