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

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

Java主线程如何等待两个子线程执行完毕?

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

方法一:使用 CompletableFuture.allOf

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

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

示例代码:

CompletableFuture futureA = CompletableFuture.runAsync(() -> {    // 子线程 A 的任务});CompletableFuture futureB = CompletableFuture.runAsync(() -> {    // 子线程 B 的任务});CompletableFuture allDone = CompletableFuture.allOf(futureA, futureB);allDone.thenRun(() -> {    // 所有子线程都执行完毕后执行此代码    // 处理共享数据});

方法二:使用 CountDownLatch

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

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 不是线程安全的,建议使用线程安全的替代方案,例如 ConcurrentHashMapCopyOnWriteArrayList

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

以上就是Java多线程:如何优雅地等待两个子线程执行完毕再继续主线程?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/274730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何解决PHP项目中对MicrosoftIdentity平台的认证问题?使用microsoft/kiota-authentication-phpleague库可以!
上一篇 2025年11月4日 14:00:17
摩尔线程 Round Attention:以轮次块稀疏性开辟多轮对话优化新范式
下一篇 2025年11月4日 14:00:21

相关推荐

发表回复

登录后才能评论
关注微信