CountDownLatch 简介
CountDownLatch 是一个同步工具,允许一个或多个线程 等待其他线程(一个或多个线程)完成一组操做。
CountDownLatch 中的方法不多:
| public CountDownLatch(int count) | 构造方法 | count 是同步计数的初始值 |
|
public void countDown() |
递减count值 | 递减计数器,每次减1,当count为0时,释放所有堵塞线程 |
| public boolean await(long timeout, TimeUnit unit) | 堵塞线程 |
堵塞当前线程,直到count计数为0。 该方法有返回值:true 计数器=0, false 计数器>0 timeout:超时时间,当超过这个时间,将不再等待其他线程(不再堵塞当前线程) TimeUnit:等待时间的单为 |
| public void await() | 堵塞线程 | 堵塞当前线程,直到count计数为0。 |
| public long getCount() | 获取当前count计数 |
例子:老板雇佣了10个工人,当10个工人都工作完后,通知老板来检查,然后发工资
先看执行结果:
老板分配工作 工人0:工作用了8分钟 工人5:工作用了8分钟 工人6:工作用了5分钟 工人4:工作用了5分钟 工人1:工作用了7分钟 工人3:工作用了6分钟 工人2:工作用了8分钟 工人8:工作用了8分钟 老板去吃饭,一会查看工作 工人7:工作用了7分钟 工人9:工作用了8分钟 工人4: 干完活 工人6: 干完活 工人3: 干完活 工人1: 干完活 工人7: 干完活 工人0: 干完活 工人2: 干完活 工人9: 干完活 工人5: 干完活 工人8: 干完活 老板发工资了!!!!
示例代码:
public class CountdownLatchTest1 {
public static void main(String[] args) {
// 雇佣人数
int workCount = 10;
CountDownLatch countDownLatch = new CountDownLatch(workCount);
System.out.println("老板分配工作");
for (int i = 0; i < workCount; i++) {
Thread thread = new Thread("工人" + i) {
@Override
public void run() {
workTime();
System.out.println(Thread.currentThread().getName() + ": 干完活");
countDownLatch.countDown();
}
};
// 开始工作
thread.start();
}
try {
System.out.println("老板去吃饭,一会查看工作");
// 等待其他工人工作完
countDownLatch.await();
// 通知老板发工资
money();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 随机计算工人的工作时间
*/
public static void workTime() {
try {
int sleep = (int) (5 + Math.random() * (5 - 1 + 1));
System.out.println(Thread.currentThread().getName() + ":工作用了" + sleep + "分钟");
TimeUnit.SECONDS.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 发工资
*/
public static void money() {
System.out.println("老板发工资了!!!!");
}
}

浙公网安备 33010602011771号