CountDownLatch
2019-07-11 本文已影响0人
刘一一同学
1. 概述
CountDownLatch
(多线程控制工具)能够使一个主线程等待其他线程完成各自的工作后再执行自己的任务。
2. 实现原理
CountDownLatch是通过一个计数器来实现的,计数器的初始值为需要等待的线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务。
2.1 核心方法
-
countDown()
:用于减少计数器次数,每调用一次就会减少1。 -
await()
:表示计数的值什么时候为0时,才返回主线程执行,否则处于阻塞状态。
3. 代码示例
举个例子,
CountDownLatch
就像跑步比赛中的裁判,有3位运动员参加比较,其中2、3运动员已经到达终点。这时,裁判员不能因为2、3运动员到达终点就宣布比赛结束,而是要一直等待所有运动员到达终点。
public class CountDownLatchDemo implements Runnable {
static final CountDownLatch latch = new CountDownLatch(5);
static final CountDownLatchDemo demo = new CountDownLatchDemo();
@Override
public void run() {
try {
Thread.sleep(new Random().nextInt(10) * 1000);
System.out.println("到达终点" + Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 计数减一
// 放在finally避免任务执行过程出现异常,导致countDown()不能被执行。
latch.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i=0; i<5; i++){
exec.execute(demo);
}
// 等待所有运动员到达终点
latch.await();
// 比赛结束
System.out.println("End!");
// 关闭线程池
exec.shutdown();
}
}