最近项目在执行过程中,有多个 独立模块 异步执行,将执行结果统一处理后返回,代码可以顺序调用各个模块执行,然后统一处理,但是效率过低,考虑采用多线程异步处理,但异步执行提交任务后就顺序执行其他代码了,无法统一获取各模块处理结果。采用countDownLatch可以等待所有异步线程执行完成再统一处理。
- countDownLatch jdk里描述
A synchronization aid that allows one or more threads to wait until
a set of operations being performed in other threads completes.
一个允许等待一个或多个其它线程执行完成的同步助手
使用场景:
1.等待一个或多个线程完成再执行其它操作
2.等待一个线程执行多次再执行其它操作
- countDownLatch实现原理
private final Sync sync;
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
初始化时将任务个数传递给同步控制器Sync,每次调用countDown方法,开始执行异步任务,Sync释放一个资源
public void countDown() {
sync.releaseShared(1);
}
调用await,await