天天看點

多線程:CyclicBarrier Demo

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

繼續閱讀