java多线程等待协调工作:CountDownLatch类的高级应用
一:说明
基本上对于线程初步了解的人,都是使用synchronized来同步线程的,也确实,它也是可以满足一些常用的问题。那么我们来说一些它不能解决的问题(其实是不怎么好解决的问题,并不是真的不能解决)
1.1:场景一
问题:
在一场运动会上,有10个运动员,只有当10个运动员都准备完毕后,所有人才能一起跑,否则就算前面的运动员在几天前都做好准备了,只要最后一个运动员没有做好准备,那所有的人都不能跑,有失公平嘛!
常规的解决方法
定义一个计数器,并且对它的操作进行同步,当每有一个准备完毕后,增加这个计数器的准备好的数量,当达到10个的时候,全部一起运行,那么大概的代码是这样子的,程序要定义一个死循环,只有当所有的条件满足的时候,才能往下走,否则就一直循环。
1.2:场景二:多线程下载文件,我们使用它来作为例子
为了提高下载效率,充分利用网络资源,决定使用多线程来下载一个文件,那么每一个线程分别下载一小段文件,当所有的文件下载完之后,对所有的文件进行合并,那就得到完整的文件了。
理论上来说代码是这样子的(理论上,实际上是错误的)
public static void go(){
System.out.println("开始下载文件,开启10个线程下载");
for(int i = 0 ; i < 10 ; i ++){
new Thread(){
public void run(){
System.out.println("文件下载完成");
}
}.start();
}
//开始合并文件
System.out.println("所有文件下载完成,开始合并文件");
}
上面的代码开启了10个线程去下载文件,下载完之后,执行合并文件的方法,但是由于多线程,合并文件的时候,线程肯定是没有执行完成的。
要怎么办呢?这个时候命名用synchronized肯定是没用的,synchronized只是使得同一时间只有一个线程通过
二:CountDownLatch使用所有的线程等待。
CountDownLatch这个类,可以使得所有的线程,全部停在那一个位置,达到指定的条件的时候,才可以运行。先给出代码
public static void main(String[] args) throws Exception {
//这里的构造方法参数是指需要达到完成的数量个数
final CountDownLatch cd = new CountDownLatch(10);
for(int i = 0 ; i < 10 ; i ++){
new Thread(){
public void run(){
System.out.println("文件下载完成");
//还记得之前构造方法的参数吗,10,每调用一个countDown()方法,都会使得这个数值减1
cd.countDown();
}
}.start();
}
//这个方法,会使得所有的线程暂停,只有当cd构造方法里面的值为0的时候,才能走通,调用一个countDown()方法,都会使得这个数值减1
cd.await();
//或者使用这个方法,这个方法也会等待数值到0才会往下面走,但是如果达到指定的时间,还没有达到0,它也会走过
// cd.await(1000, TimeUnit.MINUTES);
//开始合并文件
System.out.println("所有文件下载完成,开始合并文件");
}
执行结果是这样的
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
文件下载完成
所有文件下载完成,开始合并文件
这样就满足条件啦
java多线程等待协调工作:CountDownLatch类的高级应用的更多相关文章
- java多线程并发去调用一个类的静态方法安全性探讨
java多线程并发去调用一个类的静态方法安全性探讨 转自:http://blog.csdn.net/weibin_6388/article/details/50750035 这篇文章主要讲多线程对 ...
- java多线程10:并发工具类CountDownLatch、CyclicBarrier和Semaphore
在JDK的并发包(java.util.concurrent下)中给开发者提供了几个非常有用的并发工具类,让用户不需要再去关心如何在并发场景下写出同时兼顾线程安全性与高效率的代码. 本文分别介绍Coun ...
- Java多线程系列——线程阻塞工具类LockSupport
简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞. 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执 ...
- 【Java多线程系列五】列表类
一些列表类及其特性 类 线程安全 Iterator 特性 说明 Vector 是 fail-fast 内部方法用synchronized修饰,因此执行效率较低 1. 线程安全的列表类并不意味着调用它 ...
- JAVA多线程提高五:原子性操作类的应用
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...
- java多线程无锁和工具类
1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...
- Java多线程_同步工具CountDownLatch
概念:CountDownLatch是多线程里面一个类似于计数器的高级同步工具,它的初始值代表线程的数量,当一个线程完成了任务后,CountDownLatch的值就减1,当值为0的时候,代表所有线程完成 ...
- JAVA多线程学习九-原子性操作类的应用
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2.因为A和B线程在更新变量i ...
- java多线程(一)之继承Thread类
一.概述 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 二.两种实现方式, 下面为第一种方式: 继承Thread类 ...
随机推荐
- C++ 回调函数的定义与用法
一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...
- SQL语句 多表基本操作
创建四张表学生表:学号(Sno).姓名(Sname).性别(Ssex).年龄(Sage)教师表:教师编号(Tno).教师姓名(Tname)课程表:课程编号(Cno).课程名(Cname).教师编号(T ...
- ICollection
ICollection 接口是 System.Collections 命名空间中类的基接口.ICollection 接口扩展 IEnumerable:IDictionary 和 IList 则是扩展 ...
- 安卓初級教程(4):sqlite建立資料庫
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...
- 业务安全通用解决方案——WAF数据风控
业务安全通用解决方案——WAF数据风控 作者:南浔@阿里云安全 “你们安全不要阻碍业务发展”.“这个安全策略降低用户体验,影响转化率”——这是甲方企业安全部门经常听到合作团队抱怨.但安全从业者加入公司 ...
- 我所理解的RESTful Web API [设计篇]
<我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...
- Visualize The Workshop
这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 今天这篇文章是准备瞎扯的.平常工作的时候,我希望尽可能的将一切自动化,让自己尽可能的舒适与懒惰.两个输 ...
- TODO:Golang UDP连接简单测试慎用Deadline
TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...
- 移动开发--Hybrid和Native混合开发-->HybridApp 、NativeApp、WebApp
1.1. APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等).金融(各手机行业.P2P借贷等).医疗(智慧医疗).交通(滴滴.Uber等).教育(慕课网 ...
- datagrid界面,链接数据库读取数据
1.学生列表的 HTML部分 <script type="text/javascript"> $(function(){ //创建dataGrid $("#d ...