執行緒建立與銷毀消耗系統資源,頻繁創建銷毀導致效能抖動。線程池透過複用執行緒、控制併發數量、管理任務佇列,顯著提升系統回應速度與穩定性,猶如資料庫連線池之於資料庫存取。JDK 1.5 java.util.concurrent 套件正式提供工業級線程池支援,本文從「設計需求」與「API 實戰」兩維度全面解析。
ThreadFactory)RejectedExecutionHandler)| 方法 | 特性 | 適用場景 |
|---|---|---|
newFixedThreadPool(n) | 固定核心數 = 最大數 = n,無界佇列 | 長期穩定併發負載、需控制資源上限 |
newCachedThreadPool() | 核心數 0,最大數 Integer.MAX_VALUE,60秒閒置回收,同步佇列 | 大量短生命週期非同步任務、併發量波動大 |
newSingleThreadExecutor() | 單一執行緒序列化執行,無界佇列 | 需嚴格序列化的任務(如資料庫寫入、日誌刷盤) |
newScheduledThreadPool(n) | 支援定時/週期性任務 | 定時作業、延遲執行、心跳檢測 |
所有 Executors 方法底層均委託 ThreadPoolExecutor,直接使用構造函數可解鎖完整配置能力:
public ThreadPoolExecutor(
int corePoolSize, // 核心執行緒數
int maximumPoolSize, // 最大執行緒數
long keepAliveTime, // 非核心執行緒閒置存活時間
TimeUnit unit, // 時間單位
BlockingQueue<Runnable> workQueue, // 任務佇列
ThreadFactory threadFactory, // 執行緒工廠
RejectedExecutionHandler handler // 拒絕策略
)
RejectedExecutionException,適合關鍵業務不可丟失ThreadFactory factory = new ThreadFactoryBuilder()
.setNameFormat("order-processor-%d")
.setDaemon(false)
.setPriority(Thread.NORM_PRIORITY)
.setUncaughtExceptionHandler((t, e) -> log.error("執行緒異常", e))
.build();
預設 maximumPoolSize = Integer.MAX_VALUE,大量任務湧入會瘋狂建立執行緒耗盡記憶體。**解決方案**:自訂 ThreadPoolExecutor 設定合理最大數,或使用有界佇列 + CallerRunsPolicy。
無界 LinkedBlockingQueue 任務堆積時佔用大量堆記憶體。**解決方案**:改用 ArrayBlockingQueue 設定容量上限。
預設命名 pool-1-thread-1 無業務語意。**最佳實踐**:自訂 ThreadFactory 加入業務前綴。
execute(Runnable) 提交任務若拋出異常不會傳播至呼叫者。**解決方案**:使用 submit(Callable) 獲取 Future,透過 future.get() 主動檢查異常,或實作 Thread.UncaughtExceptionHandler。
getTaskCount():總提交任務數getCompletedTaskCount():已完成任務數getActiveCount():當前執行中任務數getQueue().size():佇列積壓數getPoolSize():當前執行緒數getLargestPoolSize():歷史峰值執行緒數建議整合 Prometheus/Grafana 或 Spring Boot Actuator 建構線程池儀表板,設置佇列積壓、拒絕次數、執行緒數異常告警。
掌握線程池「設計需求 → 工廠方法 → 核心參數 → 避坑指南 → 監控體系」完整知識鏈,才能在生產環境駕馭併發複雜度。下一篇將深入原始碼剖析 ThreadPoolExecutor 實現機制,揭秘動態調整、優雅關閉、擴展點設計的精髓,敬請期待。