
(圖源:CSDN 博主 lyf_007217,展示 ThreadPoolExecutor 核心參數、工作流程、拒絕策略、BlockingQueue 交互)
public ThreadPoolExecutor(
int corePoolSize, // 核心線程數:常駐線程,除非 allowCoreThreadTimeOut=true
int maximumPoolSize, // 最大線程數:隊列滿時才創建非核心線程
long keepAliveTime, // 非核心線程空閒存活時間
TimeUnit unit, // 時間單位
BlockingQueue workQueue, // 任務隊列:有界/無界直接影響擴容行為
ThreadFactory threadFactory, // 線程工廠:命名、守護線程、優先級
RejectedExecutionHandler handler // 拒絕策略:隊列滿且線程達最大時
)
| 隊列類型 | 特性 | 擴容行為 | 適用場景 |
|---|---|---|---|
ArrayBlockingQueue | 有界陣列、FIFO | 隊列滿 → 創建非核心線程 → 拒絕 | 固定緩衝、需公平鎖、可預測記憶體 |
LinkedBlockingQueue | 無界鏈表 (預設 Integer.MAX_VALUE)、FIFO | 永不滿 → 僅創建核心線程,maximumPoolSize 失效 | 任務量不可控、允許堆積、吞吐優先 |
SynchronousQueue | 零容量、直接移交、生產者等待消費者 | 無隊列緩衝 → 直接創建線程 (至 maximumPoolSize) → 拒絕 | 高併發、短任務、即時處理、CachedThreadPool |
PriorityBlockingQueue | 無界、優先級排序 | 同 LinkedBlockingQueue | 任務有優先級、延遲執行 |
DelayQueue | 無界、延遲執行 (實現 Delayed) | 同 LinkedBlockingQueue | 定時任務、緩存過期清理 |
| 策略 | 行為 | 適用場景 |
|---|---|---|
AbortPolicy (預設) | 拋出 RejectedExecutionException | 關鍵業務、必須感知過載 |
CallerRunsPolicy | 呼叫者執行緒直接執行任務 | 緩衝峰值、自然背壓、不丟任務 |
DiscardPolicy | 靜默丟棄任務 | 非關鍵、可容忍丟失 (如日誌、監控) |
DiscardOldestPolicy | 丟棄隊列最舊任務,重試提交 | 優先處理新任務、隊列為緩衝 |
// 運行時動態獲取
int active = pool.getActiveCount(); // 執行中任務數
int core = pool.getCorePoolSize(); // 核心線程數
int max = pool.getMaximumPoolSize(); // 最大線程數
int queueSize = pool.getQueue().size(); // 等待任務數
long completed = pool.getCompletedTaskCount(); // 完成任務數
long taskCount = pool.getTaskCount(); // 總提交任務數
// 衍生指標
double utilization = (double) active / max; // 線程利用率
double queueRatio = (double) queueSize / max; // 隊列壓力
線程池不是「配好參數就不管」,而是需要根據業務負載特徵(CPU/IO、任務時長、峰值分佈)選型隊列、調整參數、設置監控、規劃熔斷。掌握 `ThreadPoolExecutor` 與 `BlockingQueue` 的交互機制,是從「會用」進階到「調優」的分水嶺。下一篇將實戰《高併發場景下線程池動態調優與故障診斷》。