当前位置: 首页 > 图灵资讯 > 技术篇> Java子线程如何通知主线程完成任务?

Java子线程如何通知主线程完成任务?

来源:图灵教育
时间:2025-02-27 17:33:39

java子线程如何通知主线程完成任务?

Java子线程如何优雅地通知主线程任务完成?

高效的多线程编程要求子线程在任务完成后通知主线程。本文介绍了两种常用的方法:CompletableFuture 和 CountDownLatch,并强调线程安全和最佳实践。

方法一:使用 CompletableFuture

CompletableFuture 为处理异步操作提供了一种简单的方法,并等待多个子线程完成。CompletableFuture.allOf() 所有给定的方法都可以等待 CompletableFuture 对象完成。

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

代码示例:

List<CompletableFuture<?>> futures = new ArrayList<>();

// 创建并启动子线程
for (int i = 0; i < 2; i++) {
    futures.add(CompletableFuture.runAsync(() -> {
        // 模拟子线程任务
        System.out.println("子线程 " + i + " 执行完成");
    }));
}

// 等待所有子线程完成
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

// 主线程处理数据
System.out.println("完成所有子线程执行,开始处理数据");
}

方法二:使用 CountDownLatch

CountDownLatch 它是一种等待一组事件完成的同步工具。初始化时设置计数器,每个子线程完成任务后调用 countDown() 该方法减少了计数器的一个,调用了主线程 await() 等待计数器变为零的方法。

代码示例:

final CountDownLatch latch = new CountDownLatch(2); // 初始化计数器为 2

// 创建并启动子线程
for (int i = 0; i < 2; i++) {
    new Thread(() -> {
        // 模拟子线程任务
        System.out.println("子线程 " + i + " 执行完成");
        latch.countDown(); // 计数器减 1
    }).start();
}

// 等待子线程完成主线程等待子线程
try {
    latch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 主线程处理数据
System.out.println("完成所有子线程执行,开始处理数据");
}

重要提示:

  • 线程安全: ArrayList 线程不安全。建议在并发环境下使用 CopyOnWriteArrayList 避免数据竞争。 如果共享变量需要在子线程中修改,则必须使用适当的同步机制,如 volatile 确保线程安全的关键字或锁定机制。
  • 异常处理: 在实际应用中,为了捕获和处理子线程中可能发生的异常,需要完善的异常处理机制。 CompletableFuture 提供了 exceptionally() 处理异常的方法。 CountDownLatch 需要在 await() 方法中捕获 InterruptedException。

根据具体的应用场景选择哪种方法。CompletableFuture 更适用于需要处理异步结果的情况,而且 CountDownLatch 更适合简单等待多个线程完成的情况。 记住始终优先考虑线程安全和强度的异常处理。

以上就是Java子线程如何通知主线程完成任务?有关详细信息,请关注图灵教育的其他相关文章!