Future 是一種廣泛應用的併發設計模式,位於 java.util.concurrent 包中。它代表一個異步計算的結果引用,允許主線程在提交任務後繼續執行其他工作,待需要結果時再獲取。這種「提交任務 → 繼續幹別的 → 取結果」的模式,極大簡化了需要數據流同步的併發應用開發。
ExecutorService.submit() 提交 Callable 任務,返回 Future 對象future.get() 同步阻塞等待結果,或 future.isDone() 非阻塞輪詢| 方法 | 說明 |
|---|---|
get() | 阻塞等待任務完成並返回結果 |
get(timeout, unit) | 帶超時的阻塞等待,避免無限期阻塞 |
isDone() | 非阻塞檢查任務是否完成 |
cancel(boolean) | 嘗試取消任務執行 |
isCancelled() | 判斷任務是否被取消 |
ExecutorService executor = Executors.newCachedThreadPool();
List<Future<String>> futures = new ArrayList<>();
// 提交 10 個異步任務
for (int i = 0; i < 10; i++) {
futures.add(executor.submit(new TaskWithResult(i)));
}
// 獲取所有結果
for (Future<String> future : futures) {
try {
System.out.println(future.get()); // 阻塞直到完成
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
Future.get() 會阻塞線程,難直接用於傳統 Actor 模型僅在首次獲取結果時才觸發計算,節省不必要的計算資源,類似 Lambda/Closure 語義。
異步流程不由調用者觸發(如定時器、外部事件),提供 set()/fulfill() 手動完成結果。
支持多次 get()/waitNext(),適用於訂閱發布、數據流變更監聽等場景。
CompletableFuture (Java 8+) 獲得更豐富的組合式 APIExecutionException 包裹了真實異常需解包Future 模式以其同步/異步自由切換、流程優雅、異常傳播清晰等優勢,成為 Java 併發編程的基石之一。