【同步工具类】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();
}
}
}
很好用的一个同步工具类
【同步工具类】CountDownLatch闭锁任务同步的更多相关文章
- 同步工具类 CountDownLatch 和 CyclicBarrier
在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...
- 并发是个什么鬼之同步工具类CountDownLatch
扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- 同步工具类—— CountDownLatch
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 CountDownLatch简介 CountDownLa ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- 深入分析同步工具类之AbstractQueuedSynchronizer
概览: AQS(简称)依赖内部维护的一个FIFO(先进先出)队列,可以很好的实现阻塞.同步:volatile修饰的属性state,哪个线程先改变这个状态值,那么这个线程就获得了优先权,可以做任何事 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- 【同步工具类】CountDownLatch
闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态. 作用:相当于一扇门,在到达结束状态之前,这扇门一直是关闭的,并且没有任务线程能够通过,当到达结束状态时,这扇门会打开并允许所有的线程通过, ...
- 深入分析同步工具类之CountDownLatch
概览: CountDownLatch又称闭锁,其作用是让一个或者多个线程挂起,直到其他的线程执行完后恢复挂起的线程,使其继续执行.内部维护着一个静态内部类Sync,该类继承AbstractQueued ...
随机推荐
- Python3.7.1学习(三)求两个list的差集、并集与交集
在python3.7.1对列表的处理中,会经常使用到Python求两个list的差集.交集与并集的方法. 下面就以实例形式对此加以分析. # 求两个list的差集.并集与交集# 一.两个list差集# ...
- webpack安装与核心概念
安装webpack webpack核心概念:入口.输出.加载器.插件.模块.模式 一.安装webpack 1.安装webpack之前需要安装nodejs环境,在使用nodejs环境自带的包管理工具np ...
- 解构ffmpeg(一)
ffmpeg应用程序项目将其核心库libav*的使用或编程抽象成FilterGraph,InputFile,OutputFile,InputStream,OutputStream,InputFilte ...
- Linux错误:Unable to locate package解决
新买一个用于机器学习的实例,镜像系统Ubuntu.想安装一个上传.下载的包. 使用命令: sudo apt-get install lrzsz 结果一直报错: 解决方法: 使用命令: sudo apt ...
- 01 JavaScript变量的声明、变量的使用、变量的命名规范和规则
变量的声明,关键字:var //声明一个变量 var name; //给变量赋值 name = '哈士奇'; //声明并赋值一个变量 var name = '哈士奇'; 变量的使用 //声明并赋值一个 ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...
- vsftpd cmds_allowed 权限控制
vsftpd cmds_allowed cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST, PASS,PASV,PORT,PWD,QUIT,RETR,RMD,RNFR, ...
- MRC和ARC混编 JSONKit的使用
-fno-objc-arc 导入头文件
- libnl的移植
libnl简介 libnl是为了方便应用程序使用netlink接口而开发的一个库.这个库为原始netlink消息传递以及不同的netlink,family专用接口提供了一个统一的接口.libnl2.0 ...
- c, ANSI C, embedded c, after IKM online assessment
C programming language was developed in 1972 by Dennis Ritchie at bell laboratories of AT&T (Ame ...