Java主线程如何等待两个子线程执行完毕?
在多线程编程中,主线程常常需要等待多个子线程完成任务后才能继续执行后续操作。本文介绍两种常用的方法:CompletableFuture.allOf 和 CountDownLatch,来优雅地解决这个问题。
方法一:使用 CompletableFuture.allOf
CompletableFuture.allOf 方法接收多个 CompletableFuture 对象作为参数,并返回一个新的 CompletableFuture。只有当所有输入的 CompletableFuture 都完成时,这个新的 CompletableFuture 才会完成。
示例代码:
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多线程:如何优雅地等待两个子线程执行完毕再继续主线程?的详细内容,更多请关注知识资源分享宝库其它相关文章!
版权声明
本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com
发表评论