Java子线程执行完毕如何通知主线程?

Java子线程执行完毕如何通知主线程?

Java线程完成后的主线程通知机制

java多线程编程中,常常需要子线程执行完毕后通知主线程。本文将介绍两种常用的方法:CompletableFuture.allOf() 和 CountDownLatch。

方法一:使用CompletableFuture.allOf()

CompletableFuture 提供了 allOf() 方法,可以等待多个 CompletableFuture 对象全部完成。 我们可以为每个子线程创建一个 CompletableFuture,并在子线程执行完成后完成该 CompletableFuture。

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

import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList;  public class Main {     public static void main(String[] args) {         List<String> list = new CopyOnWriteArrayList<>();          CompletableFuture<Void> futureA = CompletableFuture.runAsync(() -> {             // 子线程 A 的计算逻辑             list.addAll(Arrays.asList("A1", "A2", "A3"));         });          CompletableFuture<Void> futureB = CompletableFuture.runAsync(() -> {             // 子线程 B 的计算逻辑             list.addAll(Arrays.asList("B1", "B2", "B3"));         });          CompletableFuture.allOf(futureA, futureB).thenRun(() -> {             System.out.println("所有子线程执行完毕,开始处理 list: " + list);         });     } }

方法二:使用CountDownLatch

CountDownLatch 也是一种线程同步工具构造函数接收一个整数参数,表示需要等待的线程数量。子线程执行完成后调用 countDown() 方法递减计数器。主线程调用 await() 方法等待计数器变为零。

import java.util.Arrays; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CopyOnWriteArrayList;  public class Main {     public static void main(String[] args) throws InterruptedException {         List<String> list = new CopyOnWriteArrayList<>();         CountDownLatch latch = new CountDownLatch(2);          Thread threadA = new Thread(() -> {             // 子线程 A 的计算逻辑             list.addAll(Arrays.asList("A1", "A2", "A3"));             latch.countDown();         });          Thread threadB = new Thread(() -> {             // 子线程 B 的计算逻辑             list.addAll(Arrays.asList("B1", "B2", "B3"));             latch.countDown();         });          threadA.start();         threadB.start();          latch.await(); // 等待所有子线程完成          System.out.println("所有子线程执行完毕,开始处理 list: " + list);     } }

线程安全考虑

需要注意的是,ArrayList 不是线程安全的。为了避免并发问题,我们使用了线程安全的 CopyOnWriteArrayList。 选择哪种方法取决于具体场景和需求,CompletableFuture 更适用于异步编程场景,而 CountDownLatch 更适用于需要精确控制线程同步的场景。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享