在一些应用场合中,某段程序需要等待某个条件达到要求后才能执行,或者等待一定长的时间后才行,从jdk1.5开始就可以使用CountDownLatch实现。CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞后面程序执行,直到计数器为0,await(long timeout, TimeUnit unit),是等待一定时间,然后执行,不管计数器是否到0了。
下面举一个等车的例子:
10个同学上车,车等待同学上车,如果有等待时间限制,到时间就开走,不管学生上没上完。如果没有等待时间,学生上完了再开:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
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;
}
}
import java.util.Random;
import java.util.concurrent.CountDownLatch;
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;
}
//上车
@SuppressWarnings("static-access")
public boolean getOn() throws InterruptedException {
Thread.currentThread().sleep(new Random().nextInt(2) * 1000);//上车使用的时间,随机
if (CountDownLatchTest.isGone) {
return false;//不能上了,上车失败
}
System.out.print("编号为:" + myNum + "的同学上车了..");
return true;
}
}
}
[整理自网络]
分类目录
- arch/management (17)
- computer (38)
- java/j2ee (305)
- lnmpa (237)
- mac/iphone/ipad/android (11)
- mysql/oracle/postgresql (126)
- os/software (74)
- other (518)
- python (6)
- redis/memcached/mongo (31)
- sitebuild (143)
随便看看
标签云
程序员 创业 人生箴言 eclipse 快捷键 术语 索引 unix命令 vim wordpress java学习笔记 环境变量 oracle内置函数 index 人生 数据类型 nohup tuxedo mysql学习笔记 MS-DOS命令 servlet spring 职场进阶 职业进阶 服务器选购 服务器选型 apache JPA MongoDB 注解 tomcat 子女教育 jquery maven JVM aix命令 网络营销 java异常 seo 人生规划 关键字 css 网络推广 struts 系统优化 成长 frame iframe bluehost jdbc select 我的信仰 oracle函数 cookie HashMap 站长工具 乱码 ArrayList secureCRT jsp session tail find halt 事务 oracle单记录函数 算法 URL window table javascript操作表单元素 String 字符串处理 健康 http 域名 情感 more google A记录 域名解析 netstat 弹出对话框 弹出窗口 框架集 框架 excel 字符串 javascript函数 showModalDialog nginx number 数组 sql frameset 开源程序 java数组 软件 oracle服务友情链接
收藏链接