首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Java 並發:Callable、Future 與 FutureTask 深度解析

     編輯:關於C++

核心接口對比

  • Runnable:void run() 無返回值、不可拋受檢異常。線程執行體標準接口。
  • Callable<V>:V call() throws Exception 有返回值、可拋異常。適合耗時計算任務。

Future<V> 接口

表示異步計算結果。核心方法:

  • get():阻塞獲取結果(或拋異常)。
  • isDone():判斷是否完成。
  • cancel():嘗試取消任務。

FutureTask<V> 類

實現 RunnableFuture<V>(繼承 Runnable 和 Future<V>)。關鍵特性:

  • 可包裝 Callable 或 Runnable (+ 結果值)。
  • 自身是 Runnable,可直接提交給 Executor 執行。
  • 狀態機管理任務生命周期(NEW → COMPLETING → NORMAL/EXCEPTIONAL/CANCELLED)。

代碼演示

public class Main {
    public static void main(String[] args) throws Exception {
        // 1. 直接用 Thread 運行 FutureTask(Callable)
        Callable task = () -> { Thread.sleep(500); return 42; };
        FutureTask ft = new FutureTask<>(task);
        new Thread(ft).start();
        System.out.println("結果: " + ft.get()); // 阻塞等待

        // 2. 線程池提交 Callable 返回 Future
        ExecutorService es = Executors.newSingleThreadExecutor();
        Future f = es.submit(() -> 123);
        System.out.println("線程池結果: " + f.get());
        es.shutdown();

        // 3. 包裝 Runnable + 自定義結果
        FutureTask ft2 = new FutureTask<>(() -> "hello", "world");
        new Thread(ft2).start();
        System.out.println("Runnable結果: " + ft2.get());
    }
}

輸出示例

結果: 42
線程池結果: 123
Runnable結果: world

最佳實踐

  • 耗時計算用 Callable + 線程池 submit 獲取 Future。
  • 需手動控制任務啟動/取消時用 FutureTask 直接跑 Thread。
  • get() 會阻塞,異步非阻塞場景可用 CompletableFuture (Java 8+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved