使用Java线程同步工具类CountDownLatch

发布时间 2023-07-16 23:22:16作者: nuccch

java.util.concurrent.CountDownLatch是Java并发并发编程中的线程同步工具类,基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现。
CountDownLatch工具类主要应用在如下场景:等待一组线程执行完毕后继续执行后续操作。

应用举例:模拟使用多个线程同时调用多个RPC方法,然后汇总所有线程获取到的返回结果。

// 模拟同时调用多个接口获取数据,汇总后返回给客户端
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));
}

输出:

等待所有方法执行完毕...
线程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]

完毕!