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

Java 多線程進階:Callable、Future 與 FutureTask 實現帶返回值的線程

     編輯:Java 綜合教學

為什麼需要 Callable?

傳統 Thread 與 Runnable 無法直接獲取執行結果。若有多個線程並行計算,最終需匯總結果(如 Thread1~3 統計數據,Thread4 匯總),Callable + Future 是標準解法。

核心介面對比

介面方法簽名返回值拋出異常
Runnablevoid run()無不可拋受檢異常
Callable<V>V call()泛型 V可拋 Exception

Future 與 FutureTask

  • Future<V>:代表非同步計算的結果,提供 get() 阻塞獲取結果、cancel() 取消任務、isDone() 判斷完成狀態
  • FutureTask<V>:實作 RunnableFuture<V>,同時是 Runnable(可提交執行緒池)與 Future(可獲取結果)

實戰範例:Servlet 初始化時啟動後台任務

public class GreyStartServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        // 包裝 Callable 為 FutureTask
        FutureTask<String> task = new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                start();  // 耗時操作
                return "Collection Completed";
            }
        });
        // 提交給新執行緒執行,不阻塞 Tomcat 啟動
        new Thread(task).start();
    }

    private static void start() throws Exception {
        Thread.sleep(1000);  // 模擬耗時初始化
    }
}

進階用法:執行緒池提交

ExecutorService executor = Executors.newFixedThreadPool(3);

List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    final int taskId = i;
    Future<Integer> future = executor.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            // 模擬統計邏輯
            Thread.sleep(500);
            return taskId * 100;
        }
    });
    futures.add(future);
}

// 主線程匯總結果
int total = 0;
for (Future<Integer> f : futures) {
    total += f.get();  // 阻塞直到結果就緒
}
System.out.println("總計:" + total);

executor.shutdown();

關鍵注意事項

  • Future.get() 會阻塞當前線程,建議設定超時:get(5, TimeUnit.SECONDS)
  • 異常處理:call() 拋出的異常會被包裝在 ExecutionException 中,get() 時重拋
  • 取消任務:future.cancel(true) 嘗試中斷正在執行的任務
  • FutureTask 可重複提交嗎?不可,執行完成後狀態固定,需新建實例

延伸閱讀

推薦博文:Callable 和 Future 深度解析

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved