JDK 1.5 引入 java.util.concurrent 包,提供了工業級的線程池實現。本文系統介紹 Executor 體系架構、Executors 四大預置線程池、ThreadPoolExecutor 七大核心參數與拒絕策略,助你根據業務場景選擇最優配置。
Executor (頂層,單方法 execute(Runnable))
↑
ExecutorService (繼承,添加 submit/shutdown 等生命周期管理)
↑
ThreadPoolExecutor (默認實現,核心邏輯)
↑
ScheduledThreadPoolExecutor (繼承,支援定時/周期任務)
關鍵點:Executor 只是執行工具,真正的線程池接口是 ExecutorService。
| 方法 | 特點 | 底層參數 | 適用場景 |
|---|---|---|---|
newSingleThreadExecutor() | 單線程串行,保證任務順序 | core=max=1, 無界隊列 | 順序執行、無併發需求的任務 |
newFixedThreadPool(n) | 固定大小,超出排隊 | core=max=n, 無界隊列 | 長期運行、負載穩定的業務 |
newCachedThreadPool() | 可緩存,閒置 60s 回收,上限 Integer.MAX_VALUE | core=0, max=MAX, SynchronousQueue | 短耗時、突發性高併發任務 |
newScheduledThreadPool(n) | 支援定時/周期調度 | ScheduledExecutorService 實現 | 定時任務、心跳檢測、定時清理 |
代碼驗證:文中附帶 Lambda + Stream 測試代碼,輸出線程名證明各池行為差異。
public ThreadPoolExecutor(
int corePoolSize, // 核心線程數:池中長期保持的線程數
int maximumPoolSize, // 最大線程數:高負載時可膨脹的上限
long keepAliveTime, // 非核心線程閒置存活時間
TimeUnit unit, // 時間單位
BlockingQueue<Runnable> workQueue, // 任務隊列:關鍵影響排隊策略
ThreadFactory threadFactory, // 線程創建工廠(可命名、設置守護線程)
RejectedExecutionHandler handler // 拒絕策略:隊列滿且線程達最大時觸發
)
LinkedBlockingQueue:無界隊列,maximumPoolSize 失效,任務全進隊列(Fixed/Single 底層使用)。ArrayBlockingQueue:有界隊列,需配合 maximumPoolSize 實現「隊列滿→擴線程→再滿→拒絕」完整邏輯。SynchronousQueue:直傳隊列(容量 0),任務必須有線程立即消費,否則阻塞(Cached 底層使用)。| 策略 | 行為 |
|---|---|
AbortPolicy (默認) | 拋出 RejectedExecutionException |
DiscardPolicy | 靜默丟棄任務 |
DiscardOldestPolicy | 丟棄隊頭最老任務,重試提交 |
CallerRunsPolicy | 由調用線程同步執行任務(背壓) |