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

Java 多線程核心關鍵字全景圖:Runnable/Callable/Future/Executor 體系深度解析

     編輯:Java 相關知識

核心類別分類速覽

類別核心接口/類核心職責
任務定義Runnable、Callable<V>定義線程執行邏輯,Callable 支持返回值/拋出異常
結果持有Future<V>、FutureTask<V>異步計算結果佔位符,支持取消/超時/獲取結果
執行調度Executor、ExecutorService、Executors、ThreadPoolExecutor線程池管理、任務提交、生命週期控制

一、任務定義:Runnable vs Callable

三種創建線程方式對比

方式優點缺點獲取當前線程
繼承 Thread代碼簡單,this 即線程單繼承限制,無返回值this
實現 Runnable避免單繼承,邏輯分離無返回值,需額外機制獲取結果Thread.currentThread()
實現 Callable有返回值、可拋異常,配合 Future 獲取結果需配合 FutureTask/ExecutorService 使用Thread.currentThread()

代碼示例

// 1. 繼承 Thread
class DemoThread extends Thread {
    @Override public void run() { /* 耗時操作 */ }
}
new DemoThread().start();

// 2. 實現 Runnable(常用 Lambda)
new Thread(() -> { /* do something */ }).start();

// 3. 實現 Callable + FutureTask 獲取返回值
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
    // 耗時計算
    return 42;
});
new Thread(futureTask).start();
Integer result = futureTask.get(); // 阻塞直到結果返回

二、結果持有:Future 與 FutureTask

Future 接口核心方法

  • get():阻塞獲取結果
  • get(timeout, unit):帶超時獲取
  • cancel(mayInterruptIfRunning):嘗試取消任務
  • isDone() / isCancelled():狀態查詢

關鍵繼承關係

RunnableFuture<V> extends Runnable, Future<V>
FutureTask<V> implements RunnableFuture<V>  // Future 唯一實現類

因此 FutureTask 既可作為任務提交給 Executor,又可直接 new Thread(futureTask).start()。

兩種提交方式

// 方式 A:手動包裝 Thread
FutureTask<Integer> ft = new FutureTask<>(() -> 42);
new Thread(ft).start();
Integer r = ft.get();

// 方式 B:提交給線程池(推薦)
ExecutorService executor = Executors.newCachedThreadPool();
FutureTask<Integer> ft = new FutureTask<>(() -> 42);
executor.submit(ft);
Integer r = ft.get();

三、執行調度:Executor 體系全景

核心接口層級

Executor (核心接口,單一方法 execute(Runnable))
  ↑
ExecutorService (擴展:submit、shutdown、invokeAll 等)
  ↑
ThreadPoolExecutor (具體實現,高度可配置)
  ↑
Executors (工廠類,提供預設線程池)

ThreadPoolExecutor 七大參數詳解

new ThreadPoolExecutor(
    corePoolSize,      // 核心線程數
    maximumPoolSize,   // 最大線程數
    keepAliveTime,     // 非核心線程空閒存活時間
    TimeUnit unit,     // 時間單位
    BlockingQueue<Runnable> workQueue, // 任務隊列
    ThreadFactory threadFactory,       // 線程創建工廠
    RejectedExecutionHandler handler   // 拒絕策略
)

Executors 三大預設線程池(生產環境慎用)

方法特點適用場景風險
newFixedThreadPool(n)固定大小,無界隊列長期任務、控制併發度隊列積壓導致 OOM
newCachedThreadPool()無界線程,60s 回收空閒短期異步任務線程數暴增導致 OOM
newSingleThreadExecutor()單線程串行順序執行任務單點阻塞、隊列積壓

生產建議:顯式構建 ThreadPoolExecutor,有界隊列 + 自定義拒絕策略,並監控線程池指標。

總結:從關鍵字到工程落地

  1. 任務有返回值 → Callable + FutureTask
  2. 需要線程池管理 → 直接用 ThreadPoolExecutor,避開 Executors 預設陷阱
  3. 異步編排 → 進階可學 CompletableFuture(Java 8+)或框架如 ExecutorService + ListenableFuture

掌握這張全景圖,Java 併發編程不再是「一團亂麻」。

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