核心接口對比
void run() 無返回值、不可拋受檢異常。線程執行體標準接口。V call() throws Exception 有返回值、可拋異常。適合耗時計算任務。Future<V> 接口
表示異步計算結果。核心方法:
get():阻塞獲取結果(或拋異常)。isDone():判斷是否完成。cancel():嘗試取消任務。FutureTask<V> 類
實現 RunnableFuture<V>(繼承 Runnable 和 Future<V>)。關鍵特性:
Callable 或 Runnable (+ 結果值)。Runnable,可直接提交給 Executor 執行。代碼演示
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+)。