当前位置: 首页 > 图灵资讯 > 技术篇> Java多线程:如何优雅地等待两个子线程执行完毕再继续主线程?

Java多线程:如何优雅地等待两个子线程执行完毕再继续主线程?

来源:图灵教育
时间:2025-02-27 17:35:41

java多线程:如何优雅地等待两个子线程执行完毕再继续主线程?

Java主线程如何等待两个子线程完成?

在多线程编程中,主线程通常需要等待多个子线程完成任务才能继续执行后续操作。本文介绍了两种常用的方法:CompletableFuture.allOf 和 CountDownLatch,优雅地解决这个问题。

方法一:使用 CompletableFuture.allOf

CompletableFuture.allOf 接收多种方法 CompletableFuture 对象作为参数,返回一个新的 CompletableFuture。只有当所有输入 CompletableFuture 当一切都完成时,这个新的 CompletableFuture 才会完成。

立即学习“Java免费学习笔记(深入);

示例代码:

CompletableFuture<Void> futureA = CompletableFuture.runAsync(() -> {
    // 子线程 A 的任务
});

CompletableFuture<Void> futureB = CompletableFuture.runAsync(() -> {
    // 子线程 B 的任务
});

CompletableFuture<Void> allDone = CompletableFuture.allOf(futureA, futureB);
allDone.thenRun(() -> {
    // 所有子线程执行后执行此代码
    // 处理共享数据
});

方法二:使用 CountDownLatch

CountDownLatch 它是一个可用于同步多个线程的计数器。主线程调用 await() 等待计数器减为的方法 0,子线程完成任务后调用 countDown() 减少计数器的方法 1。

示例代码:

CountDownLatch latch = new CountDownLatch(2); // 初始化计数器为 2 (两个子线程)

Thread threadA = new Thread(() -> {
    // 子线程 A 的任务
    latch.countDown(); // 计数器减 1
});

Thread threadB = new Thread(() -> {
    // 子线程 B 的任务
    latch.countDown(); // 计数器减 1
});

threadA.start();
threadB.start();

try {
    latch.await(); // 等待计数器的主线程减少 0
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 所有子线程执行后执行此代码
// 处理共享数据

线程安全与共享变量

若主线程和子线程需要共享数据(例如) ArrayList),必须确保数据访问的线程安全。ArrayList 如果线程不安全,建议使用线程安全的替代方案,如 ConcurrentHashMap 或 CopyOnWriteArrayList。

根据具体情况选择哪种方法。CompletableFuture 更适合基于异步操作的场景, CountDownLatch 更适合需要精确控制线程同步的场景。 这两种方法都能有效地解决主线程等待子线程完成的问题,保证程序的正确性和稳定性。

以上是Java多线程:如何在继续主线程之前优雅地等待两个子线程的执行?有关详细信息,请关注图灵教育的其他相关文章!