List<CompletableFuture<Void>> futures = new ArrayList<>();// 提交10個異步任務
for (int i = 0; i < 10; i++) {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {insertData(batchData); // 每個任務插入一批數據}, pool).thenAccept();futures.add(future); // 將Future對象存入列表
}// 等待所有任務完成
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
通過CompletableFuture
或回調函數,調用線程無需等待任務完成,實現真正的異步
Future
ExecutorService pool = Executors.newFixedThreadPool(2);
List<CompletableFuture<Void>> futures = new ArrayList<>();for (int i = 1; i <= 3; i++) {int taskId = i;CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {Thread.sleep(1000);return "Result-" + taskId;}, pool).thenAccept(result -> {System.out.println("[Callback] Task " + taskId + " => " + result);});futures.add(future); // 保存Future對象
}// 等待所有任務完成(阻塞主線程)
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
pool.shutdown();
System.out.println("所有任務完成!");
沒有future會咋樣?
(1) 主線程不會等待任務完成
(2) 無法統一處理任務狀態
-
失去的能力:
-
無法通過?
CompletableFuture.allOf()
?等待所有任務完成。 -
無法統計成功/失敗的任務數量。
-
無法集中處理異常(如記錄失敗日志或重試)
Q:我都要主線程等待了,為啥還用異步,直接用普通線程池不就行了
使用?異步任務(如?CompletableFuture
)+ 主線程等待?相比?普通線程池阻塞等待,在以下場景中具有顯著優勢:
-
靈活組合任務:可輕松實現“任務并行→結果聚合”的流程(如?
allOf
/anyOf
)。 -
非阻塞回調:即使主線程等待,仍能通過回調處理中間結果(如進度更新)。