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 分享