简介

一个多线程同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待

用法

1
2
3
4
5
6
7
8
//构造方法参数指定了计数的次数
public CountDownLatch(int count);

//子线程执行完后调用此方法,则计数减1
public void countDown();

//主线程调用此方法会一直阻塞当前线程,直到计时器的值为 0
public void await() throws InterruptedException

示例

示例有潜在问题:使用 CountDownLatch 进行异步转同步操作,每个线程退出前必须调用 countDown 方法,线程执行代码注意 catch 异常,确保 countDown 方法被执行到,避免主线程无法执行 至 await 方法,直到超时才返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CountDownLatch countDownLatch = new CountDownLatch(2);
Map<String, Object> map = new HashMap<String, Object>();
new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
List<PersonDto> l = personHouseHolderService.getPersonHouseHolderListByPage(searchMap);
map.put("rows", l);
countDownLatch.countDown();
}
}).start();

new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
int total = personHouseHolderService.selectCountHouseHolder(searchMap);
map.put("total", total);
countDownLatch.countDown();
}
}).start();

countDownLatch.await();