直接 new Thread() 缺點多:資源消耗大、響應慢、無管控。線程池透過重用、管控、定時功能解決這些問題。本文系統講解 Executors 四大工廠、ThreadPoolExecutor 七大參數、BlockingQueue 策略、關閉機制、流程圖與優化建議。
| 方法 | corePoolSize | maximumPoolSize | keepAliveTime | workQueue | 適用場景 |
|---|---|---|---|---|---|
| newCachedThreadPool() | 0 | Integer.MAX_VALUE | 60s | SynchronousQueue | 短任務、數量波動大 |
| newFixedThreadPool(n) | n | n | 0 | LinkedBlockingQueue | 固定併發、長任務 |
| newSingleThreadExecutor() | 1 | 1 | 0 | LinkedBlockingQueue | 串行執行、順序敏感 |
| newScheduledThreadPool(core) | core | Integer.MAX_VALUE | 0 | DelayedWorkQueue | 定時/週期任務 |
共同預設:DefaultThreadFactory (命名 pool-m-thread-n)、AbortPolicy 拒絕策略。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, RejectedExecutionHandler handler)
prestartCoreThread() 預熱。allowCoreThreadTimeOut(true) 可套用至核心線程。SynchronousQueue:不緩衝,直接交給線程,適合無界 maxPoolLinkedBlockingQueue:core 線程忙時入隊,線程數不超過 coreArrayBlockingQueue:防資源耗盡,需平衡隊列大小與 maxPoolAbortPolicy:拋 RejectedExecutionException (預設)CallerRunsPolicy:調用者執行,自然限流DiscardPolicy:靜默丟棄DiscardOldestPolicy:丟棄隊頭最舊任務並重試| 隊列 | 特性 | 適用 |
|---|---|---|
| ArrayBlockingQueue | 陣列有界、FIFO、可公平鎖 | 固定緩衝、生產消費者 |
| LinkedBlockingQueue | 鏈表無界、FIFO、吞吐高 | FixedThreadPool、SingleThread |
| SynchronousQueue | 零容量、直接移交、雙向阻塞 | CachedThreadPool、高併發移交 |
| PriorityBlockingQueue | 優先級無界、自然序/Comparator | 優先級任務調度 |
shutdown():狀態→SHUTDOWN,中斷無任務線程,等待任務完成shutdownNow():狀態→STOP,中斷所有線程 (含執行中),返回未執行任務列表interrupt(),無法響應中斷的任務可能永不結束isShutdown() / isTerminated() 判斷狀態
taskCount / completedTaskCount:總/已完成任務數largestPoolSize:歷史峰值線程數 (若 = maxPoolSize 曾滿載)getPoolSize():當前線程數 (只增不減)getActiveCount():活躍線程數繼承線程池重寫 beforeExecute()、afterExecute()、terminated() 實現:平均/最大/最小執行時間統計、慢任務告警、執行軌跡記錄。