• 【同步工具类】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();
            }
        }
    }

    很好用的一个同步工具类

  • 相关阅读:
    mysql数据库给别人访问权限
    linux 5-sort,uniq,tar,split
    linux 4 -awk
    Linux 3 -grep
    linux 基础2-null,cut,wc,head,tail
    linux 基础-变量,shell基本语法
    [ActionScript 3.0] 利用InteractivePNG.as类精确选择识别png图片有像素的区域
    [ActionScript 3.0] 嵌入字体
    [ActionScript 3.0] AS利用ByteArray向PHP发送二进制数据生成图片
    [ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据
  • 原文地址:https://www.cnblogs.com/yangchongxing/p/9214284.html
Copyright © 2020-2023  润新知