java.util.concurrent.CountDownLatch
是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现。
CountDownLatch
工具类主要应用在如下场景:等待一组线程执行完毕后继续执行后续操作。
应用举例:模拟使用多个线程同时调用多个RPC方法,然后汇总所有线程获取到的返回结果。
代码语言:javascript复制// 模拟同时调用多个接口获取数据,汇总后返回给客户端
private static void summary() throws InterruptedException {
// 模拟需要调用10个方法才能获取到数据
int count = 10;
// 每个方法的返回结果都保存到列表中
List<Object> result = new ArrayList<>(count);
// 使用CountDownLatch来控制10个方法都执行完毕之后再汇总数据
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < count; i ) {
int index = i;
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep((new Random().nextInt(10)) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
result.add(String.format("result%s", index));
// 每个线程在执行完毕之后都必须将计数器减1
latch.countDown();
System.out.println(String.format("线程%s结束了", Thread.currentThread().getName()));
}
}).start();
}
// 等待前面的所有方法都请求完毕并得到返回结果之后再进行处理
System.out.println("等待所有方法执行完毕...");
latch.await();
// 从结果列表中获取返回信息
System.out.println(String.format("最终的汇总结果:%s", result));
}
输出:
代码语言:javascript复制等待所有方法执行完毕...
线程Thread-9结束了
线程Thread-3结束了
线程Thread-6结束了
线程Thread-5结束了
线程Thread-7结束了
线程Thread-4结束了
线程Thread-0结束了
线程Thread-2结束了
线程Thread-8结束了
线程Thread-1结束了
最终的汇总结果:[result4, result0, result9, result8, result2, result5, result3, result6]
完毕!