【同步工具类】CountDownLatch闭锁任务同步

【同步工具类】CountDownLatch闭锁任务同步

转载:https://www.cnblogs.com/yangchongxing/p/9214284.html

打过dota的同学都知道,多人一起在线打游戏,每个人的电脑性能不同,所以加载游戏需要的时间也是不同的,只有等大家都加载完成了,游戏才能开始玩,我们就模拟这个过程。

游戏

复制代码
package concurrent;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
public class DotaGame {
    public static void main(String[] args) throws InterruptedException {
        int N = 6;
        int load = 0;
        Random random = new Random();
        // 计数器为1的闭锁,模拟点击开始游戏按钮
        CountDownLatch startLatch = new CountDownLatch(1);
        // 计数器为N的闭锁,模拟打游戏的玩家
        CountDownLatch endLatch = new CountDownLatch(N);
        for(int i = 1; i <= N; i++ ) {
            // 模拟电脑性能不同需要加载时间
            load = random.nextInt(N);
            // 模拟玩家
            new Thread(new Player("play" + i, load, startLatch, endLatch)).start();
        }
        // 模拟开始游戏按钮
        System.out.println("*** 3V3游戏开始 ***");
        // 通知开始
        startLatch.countDown();
        // 等待所有玩家加载完成
        endLatch.await();
        // 游戏进行中
        System.out.println("...Killing Monster...");
        // 游戏结束
        System.out.println("*** 3V3游戏结束 ***");
    }
}
复制代码

玩家

复制代码
package concurrent;
import java.util.concurrent.CountDownLatch;
public class Player implements Runnable {
    private String name = "";//玩家姓名
    private int load;//加载时间
    private CountDownLatch startLatch;
    private CountDownLatch endLatch;
    public Player(String name, int load, CountDownLatch startLatch, CountDownLatch endLatch) {
        this.name = name;
        this.load = load;
        this.startLatch = startLatch;
        this.endLatch = endLatch;
    }
    @Override
    public void run() {
        try {
            // 等待通知开始
            startLatch.await();
            // 加载游戏
            Thread.sleep(load * 1000 * 5);
            // 等待其他玩家
            System.out.println(name + ": 加载完成,等待其他玩家。");
            // 通知加载完成
            endLatch.countDown();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}
复制代码

很好用的一个同步工具类

 

posted @   翠微  阅读(241)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示