java多线程系列:CountDownLatch
这篇文章将介绍CountDownLatch这个同步工具类的基本信息以及通过案例来介绍如何使用这个工具。
CountDownLatch是java.util.concurrent
包下面的一个工具类,可以用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 它可以允许一个或者多个线程等待其他线程完成操作。
案例
模拟游戏一开始需要加载一些基础数据后才能开始游戏,基础数据加载完可以继续加载其他数据。基础数据包含人物、地图、背景、物品等等。
解决方案
利用CountDownLatch
来实现,基础数据加载完毕后,CountDownLatch
计数器进行减一操作。当CountDownLatch
计数器为0时,表示可以开始游戏。 示意图如下
定义抽象类
定义抽象类AbstractDataRunnable
并实现Runnable
接口
抽象类包含两个属性
private String name; private CountDownLatch count;
通过构造函数初始化两个属性
public AbstractDataRunnable(String name, CountDownLatch count) { this.name = name; this.count = count; }
定义方法,提供一个抽象方法handle()
供子类去实现,getName()
和afterCountDown()
提供默认的实现。
public String getName() { return name; } public abstract void handle() throws InterruptedException; public void afterCountDown(){ System.out.println(this.getName() + ":CountDownLatch计数减一之后,继续加载其他数据..."); };
run方法如下,在调用handle()
方法之后执行count.countDown();
,让CountDownLatch
计数器进行减一操作.计数器减一之后可以继续加载额外的数据,并不影响当前线程
public void run() { try { System.out.println(this.getName()+" 开始加载..."); Long l1 = System.currentTimeMillis(); handle(); Long l2 = System.currentTimeMillis(); System.out.println(this.getName()+" 加载完成,花费时间:"+(l2-l1)); } catch (Exception e){ e.printStackTrace(); } finally { count.countDown(); } afterCountDown(); }
定义一些数据加载类
背景数据加载类如下,实现了抽象类AbstractDataRunnable
的handle()
方法,在handle()
方法休眠了2秒
public class BackGroundData extends AbstractDataRunnable { public BackGroundData(String name, CountDownLatch count) { super(name, count); } @Override public void handle() throws InterruptedException { //模拟加载时间,2秒 Thread.sleep(2000); } }
其他数据加载类代码就不贴出来了,睡眠的时间不同而已
开始游戏
开始游戏类如下,通过构造函数传入CountDownLatch
计数器,然后在run方法中执行count.await();
方法进行等待基础数据加载完毕。
class StartGame implements Runnable{ private CountDownLatch count; public StartGame(CountDownLatch count) { this.count = count; } @Override public void run() { try { System.out.println("开始加载基础数据..."); Long l1 = System.currentTimeMillis(); count.await(); Long l2 = System.currentTimeMillis(); System.out.println("基础数据加载完毕,总共花费时长:"+(l2-l1)+".可以开始游戏..."); } catch (InterruptedException e) { e.printStackTrace(); } } }
测试
public static void main(String[] args) throws IOException { CountDownLatch count = new CountDownLatch(4); //主线程 Thread startGameThread = new Thread(new StartGame(count)); startGameThread.start(); //加载数据线程 Thread mapThread = new Thread(new MapData("地图",count)); Thread goodsThread = new Thread(new GoodsData("物品",count)); Thread personageThread = new Thread(new PersonageData("人物",count)); Thread backGroundThread = new Thread(new BackGroundData("背景",count)); mapThread.start(); goodsThread.start(); personageThread.start(); backGroundThread.start(); System.in.read(); }
测试结果内容
开始加载基础数据... 地图 开始加载... 物品 开始加载... 人物 开始加载... 背景 开始加载... 人物 加载完成,花费时间:1000 人物:CountDownLatch计数减一之后,继续加载其他数据... 背景 加载完成,花费时间:2000 背景:CountDownLatch计数减一之后,继续加载其他数据... 物品 加载完成,花费时间:2501 物品:CountDownLatch计数减一之后,继续加载其他数据... 地图 加载完成,花费时间:3001 地图:CountDownLatch计数减一之后,继续加载其他数据... 基础数据加载完毕,总共花费时长:3003.可以开始游戏...
有兴趣的点个Star

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java FileWriter OutputStreamWriter类源码解析
FileWriter 因为篇幅原因,上一篇直接了字符输入流,今天来分析一下跟FileReader相对应的字符输出流FileWriter。FileWriter是将字符写入文件的通用类,构造函数假定使用默认的字符编码和默认的字节缓冲区大小8K是使用者可以接受的,如果要指定这些值,需要通过一个FileOutputStream来构造FileWriter的父类OutputStreamWriter。 文件是否有效或者是否能够被创建取决于平台,在一些平台上,对于同一个文件同一时间只允许一个FileWriter或者其他文件写入对象打开。在这种情况下,如果一个文件已经被打开,构造函数会抛出异常。 和FileReader类似,FileWriter也是除了构造函数以外全部是继承了父类的方法。先创建一个FileOutputStream,如果不给出append参数或者append为false则清空原文件从头开始写入,否则是从尾部开始扩展文件内容,使用文件描述符创建时必定是从文件头部开始写。然后通过FileOutputStream创建OutputStreamWriter public FileWriter(Str...
- 下一篇
JavaScript小游戏,键盘英雄!
该游戏仅供探讨交流。 该游戏可随意传播,请保留声明与出处。 几年前的一个夜晚孤枕难眠,突然来了灵感。创作游戏的初衷是巩固js基础,有朋友问我,为什么取这个名字呢? 可以想象你是电影的主角,打字的速度已达到独孤求败的境界,狂风呼啸电闪雷鸣,键盘声响起,键盘在你指尖灵动肆意纷飞,眨眼的功夫一部20万字撰写完毕。 生活不止眼前的苟且,还有诗和代码!当然这也是需要有想象力的。 欢迎有更多想象力的朋友分享思维,在这款游戏上面继续扩展。 html部分可以用js来生成,其中加入了H5中的audio元素,按键音效,后续还可以增加背景音乐,或者再来一个升级音效,一直没有增加的原因是,没有找到满意的音乐,看来想做一个全能大神还是有难度的,哈哈!css建议用BEM或OOCSS设计模式便于维护和模块化功能扩展。js注释的很明白,还可以添加很多功能,得分也可以更加复杂,可以生成随机数0~99,或增加生成黄色按键几率10%得分10,或增加生成蓝色按键几率5%得分30,增加趣味性,只需要调整升级机制。越来越有趣了,有时候开发要保持童心不是么? 完整项目地址:https://github.com/af66666/ty...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境