疯狂
STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
CountDownLatch 简介和例子
Posted on 2011-07-04 17:14
疯狂
阅读(9963)
评论(3)
编辑
收藏
所属分类:
java
、
concurrent
在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后此行,从jdk1.5开始就可以使用CountDownLatch实现,
CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
下面举一个等车的例子:
10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开:
public
class
CountDownLatchTest
{
public
static
int
numberOfPeople
=
10
;
//
等车的学生数
public
static
boolean
isGone
=
false
;
//
车开的标志
public
static
int
carWaitTime
=
3
;
//
车等的时间
public
static
void
main(String[] args)
throws
InterruptedException
{
CountDownLatch waitStudentsGetOn
=
new
CountDownLatch(numberOfPeople);
new
Thread(
new
GetOn(waitStudentsGetOn)).start();
waitStudentGetOn(waitStudentsGetOn);
//
等所有的学生上车
driveHome();
//
开车走
}
private
static
void
waitStudentGetOn(CountDownLatch waitStudentsGetOn)
throws
InterruptedException
{
System.out.println(
"
赶紧的,抓紧时间上车..
"
);
waitStudentsGetOn.await(carWaitTime, TimeUnit.SECONDS);
//
等5秒,还没上车,就开走。。
}
private
static
void
driveHome()
throws
InterruptedException
{
System.out.println(
"
开车,鞋儿破 帽儿破 身上的袈裟破 你笑我 他笑我 一把扇儿破
"
);
isGone
=
true
;
}
}
class
GetOn
implements
Runnable
{
private
CountDownLatch waitStudentsGetOn;
GetOn(CountDownLatch waitStudentsGetOn)
{
this
.waitStudentsGetOn
=
waitStudentsGetOn;
}
public
void
run()
{
for
(
int
i
=
0
; i
<
CountDownLatchTest.numberOfPeople; i
++
)
{
try
{
if
(CountDownLatchTest.isGone)
{
System.out.println(
"
妈的,还差:
"
+
waitStudentsGetOn.getCount()
+
"
个没娃上车呢.怎么车走了
"
);
break
;
}
boolean
goonSuccess
=
new
Student(i
+
1
).getOn();
//
顺序上车
if
(goonSuccess)waitStudentsGetOn.countDown();
}
catch
(InterruptedException e)
{}
if
(waitStudentsGetOn.getCount()
!=
0l
)
{
System.out.println(
"
还差:
"
+
(waitStudentsGetOn.getCount())
+
"
个没上车
"
);
}
else
{
System.out.println(
"
都上车了
"
);
}
}
}
class
Student
{
private
int
myNum;
//
学生编号
public
Student(
int
num)
{
this
.myNum
=
num;
}
//
上车
public
boolean
getOn()
throws
InterruptedException
{
Thread.currentThread().sleep(
new
Random().nextInt(
2
)
*
1000
);
//
上车使用的时间,随机
if
(CountDownLatchTest.isGone)
{
return
false
;
//
不能上了,上车失败
}
System.out.print(
"
编号为:
"
+
myNum
+
"
的同学上车了..
"
);
return
true
;
}
}
}
评论
#
re: CountDownLatch 简介和例子
回复
更多评论
2014-01-19 12:02 by
bo_hai
carWaitTime = 3 是等待3秒吧?
#
re: CountDownLatch 简介和例子
回复
更多评论
2014-01-19 12:09 by
bo_hai
这个模拟实例很好。博主对 CountDownLatch 理解很正确。
#
re: CountDownLatch 简介和例子
回复
更多评论
2014-12-14 14:06 by
xsank
看到了countdownlatch的await用法,谢楼主分享
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
JAVA Thread Dump 分析综述
关于java RMI在多网卡下(或者启动360,百度,腾讯等wifi共享下)无法连接问题(java.rmi.ConnectException: Connection refused to host: xx)
Quartz+Spring的集群配置(转)
java.awt.headless=true
dom4j通过xpath查询xml (转)
深入探讨 Java 类加载器
Java ClassLoader基础知识
synchronized 要注意的地方
关于java.lang.IllegalMonitorStateException
ThreadPoolExecutor运转机制详解 .
Powered by:
BlogJava
Copyright © 疯狂
日历
<
2011年7月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
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
1
2
3
4
5
6
公告
公众号:
QQjava交流群:
51374316
留言簿
(11)
给我留言
查看公开留言
查看私人留言
随笔分类
all 生活杂谈(16)
android(18)
apache项目(20)
chart(1)
concurrent(5)
database(70)
dwr(3)
flex(6)
hibernate(25)
java (135)
javafx(2)
javascript
java安全(8)
java性能(19)
jbpm(1)
jquery(4)
linux(17)
lucene(1)
netty(3)
nginx(1)
others(2)
questions(31)
questions_hander(28)
spring(32)
struts(9)
swing
UML(2)
unix(13)
web(45)
webservice(9)
xml(5)
敏捷(6)
方法论(28)
架构(21)
测试(1)
缓存
网络通讯(9)
读代码(6)
项目管理(19)
相册
我的相册
搜索
积分与排名
积分 - 2834905
排名 - 2
最新随笔
1. 后续内容请移步公众号“duomi88”
2. Netty百万级推送服务(转)
3. Netty 概述(转)
4. Netty优雅退出机制和原理(转)
5. 使用JavaMail SearchTerm 收取邮件
6. JAVA Thread Dump 分析综述
7. oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题
8. FTP主动模式和被动模式的比较(转载)
9. 关于java RMI在多网卡下(或者启动360,百度,腾讯等wifi共享下)无法连接问题(java.rmi.ConnectException: Connection refused to host: xx)
10. (转)Oracle数据库如何授权收费(Database Licensing)
11. 成功的 Web 应用系统性能测试 (转载)
12. It is indirectly referenced from required .class file异常
13. (转)svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
14. automation服务器不能创建对象 解决办法
15. ERROR: transport error 202: gethostbyname: unknown host 解决办法
16. JavaScript 跨浏览器事件处理(转)
17. 函数声明 VS 函数表达式(转)
18. ORA-06548错误
19. 项目规划与管理记录2
20. tmpFile.renameTo(classFile) failed
21. redhat6.4 64位安装rlwrap
22. ora-01031:insufficient privileges
23. mysql远程连接问题 Access denied for user 'root'@' ip ' (using password: YES)
24. dbcp重连(转)
25. 解决Vmware Workstation上安装Linux系统不能SSH远程连接的问题
26. URL最大长度限制(转)
27. 用MyEclipse测试发送email时报java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
28. 我应该采用哪一种 WSDL 样式?(转载)
29. linux 挂载ntfs usb 出现mount: unknown filesystem type 'ntfs'
30. 11g oracle 用户密码过期问题
最新评论
1. re: Oracle物化视图创建全过程(转)
评论内容较长,点击标题查看
--ya
2. re: Oracle物化视图创建全过程(转)
评论内容较长,点击标题查看
--ya
3. re: 11g oracle 用户密码过期问题
问问
--是是是
4. re: mysql远程连接问题 Access denied for user 'root'@' ip ' (using password: YES)
asdfsadf
--asdf
5. re: struts(il8n)实现国际化的一个例子
在啥地方
--正常