首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 並發編程核心:Callable、Future 與 FutureTask 異步計算完整指南

     編輯:Java 綜合教學

從 Runnable 到 Callable 的演進

傳統 Runnable 的 run() 方法無返回值且無法拋出受檢異常,Java 5 引入 Callable<V> 接口,其 call() 方法支持泛型返回值與異常拋出,完美解決異步任務結果獲取難題。

Future 接口:異步結果的控制句柄

Future<V> 代表異步計算的結果,提供五大核心能力:

  • get():阻塞獲取結果,支持超時控制
  • cancel(boolean):嘗試取消任務執行
  • isDone() / isCancelled():狀態查詢

FutureTask:雙重身份的適配器

FutureTask<V> 實現 RunnableFuture<V>(繼承 Runnable 和 Future),既可作為任務提交給執行器,又可作為結果容器:

// 方式一:配合 ExecutorService
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> futureTask = new FutureTask<>(new Task());
executor.submit(futureTask);

// 方式二:直接用 Thread 執行
Thread thread = new Thread(futureTask);
thread.start();

// 統一獲取結果
Integer result = futureTask.get();

實戰模式:CompletionService 批量異步處理

當需要提交一組 Callable 任務並按完成順序獲取結果時,ExecutorCompletionService 是最佳選擇:

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletionService<Integer> cs = new ExecutorCompletionService<>(pool);

for (int i = 0; i < 10; i++) {
    final int seq = i;
    cs.submit(() -> {
        Thread.sleep(new Random().nextInt(5000));
        return seq;
    });
}

for (int i = 0; i < 10; i++) {
    System.out.println(cs.take().get()); // 按完成順序取出
}

核心類關係圖譜

Runnable (void run())
    ↑
Callable<V> (V call() throws Exception)
    ↑
RunnableFuture<V> extends Runnable, Future<V>
    ↑
FutureTask<V> implements RunnableFuture<V>

最佳實踐建議

  • 優先使用 ExecutorService.submit(Callable) 簡化代碼
  • 長耗時任務必須設置 get(timeout, unit) 避免無限阻塞
  • 取消任務時正確處理 InterruptedException
  • Java 8+ 可考慮 CompletableFuture 實現更豐富的異步組合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved