| 類別 | 核心接口/類 | 核心職責 |
|---|---|---|
| 任務定義 | Runnable、Callable<V> | 定義線程執行邏輯,Callable 支持返回值/拋出異常 |
| 結果持有 | Future<V>、FutureTask<V> | 異步計算結果佔位符,支持取消/超時/獲取結果 |
| 執行調度 | Executor、ExecutorService、Executors、ThreadPoolExecutor | 線程池管理、任務提交、生命週期控制 |
| 方式 | 優點 | 缺點 | 獲取當前線程 |
|---|---|---|---|
繼承 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(); // 阻塞直到結果返回
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 (核心接口,單一方法 execute(Runnable))
↑
ExecutorService (擴展:submit、shutdown、invokeAll 等)
↑
ThreadPoolExecutor (具體實現,高度可配置)
↑
Executors (工廠類,提供預設線程池)
new ThreadPoolExecutor(
corePoolSize, // 核心線程數
maximumPoolSize, // 最大線程數
keepAliveTime, // 非核心線程空閒存活時間
TimeUnit unit, // 時間單位
BlockingQueue<Runnable> workQueue, // 任務隊列
ThreadFactory threadFactory, // 線程創建工廠
RejectedExecutionHandler handler // 拒絕策略
)
| 方法 | 特點 | 適用場景 | 風險 |
|---|---|---|---|
newFixedThreadPool(n) | 固定大小,無界隊列 | 長期任務、控制併發度 | 隊列積壓導致 OOM |
newCachedThreadPool() | 無界線程,60s 回收空閒 | 短期異步任務 | 線程數暴增導致 OOM |
newSingleThreadExecutor() | 單線程串行 | 順序執行任務 | 單點阻塞、隊列積壓 |
生產建議:顯式構建 ThreadPoolExecutor,有界隊列 + 自定義拒絕策略,並監控線程池指標。
Callable + FutureTaskThreadPoolExecutor,避開 Executors 預設陷阱CompletableFuture(Java 8+)或框架如 ExecutorService + ListenableFuture掌握這張全景圖,Java 併發編程不再是「一團亂麻」。