【同步工具类】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();
}
}
}
很好用的一个同步工具类