頻繁創建/銷毀線程開銷巨大 (內核對象分配、棧內存、上下文切換)。線程池實現 線程復用、任務隊列、生命周期管理,是高併發系統標配。
| 工廠方法 | 底層實現 | 核心參數 | 適用場景 | 風險 |
|---|---|---|---|---|
newFixedThreadPool(n) |
ThreadPoolExecutor | core=max=n, queue=LinkedBlockingQueue(無界) | 固定併發數、長期運行任務 | 隊列無界 → OOM 風險 |
newCachedThreadPool() |
ThreadPoolExecutor | core=0, max=Integer.MAX, queue=SynchronousQueue, keepAlive=60s | 短時任務、數量波動大 | 無界線程 → 機器耗盡 |
newSingleThreadExecutor() |
FinalizableDelegatedExecutorService | core=max=1, queue=LinkedBlockingQueue | 串行執行、順序敏感任務 | 單點瓶頸、隊列無界 |
newScheduledThreadPool(n) |
ScheduledThreadPoolExecutor | core=n, queue=DelayedWorkQueue | 定時/周期任務 | 同 FixedThreadPool 風險 |
阿里巴巴開發手冊強制: 不允許使用 Executors 創建線程池,必須手動構建
ThreadPoolExecutor明確有界隊列與拒絕策略。
四大拒絕策略選型
| 策略 | 行為 | 適用場景 |
|---|---|---|
AbortPolicy (默認) | 拋 RejectedExecutionException | 關鍵業務,不可丟失,需上層捕獲降級 |
CallerRunsPolicy | 調用者線程執行任務 (背壓) | 緩衝突發流量,保護下游,犧牲調用者響應 |
DiscardPolicy | 靜默丟棄任務 | 非關鍵監控、日志、指標上報 |
DiscardOldestPolicy | 丟棄隊列最舊任務,嘗試重新提交 | 優先處理新請求,舊數據可丟 |
future = executor.submit(() -> {
Thread.sleep(1000);
return 42;
});
try {
Integer result = future.get(2, TimeUnit.SECONDS); // 阻塞等待,支持超時
System.out.println("Result: " + result);
} catch (TimeoutException e) {
future.cancel(true); // 中斷任務
}
(100),
r -> new Thread(r, "Owner-" + r.hashCode()),
new ThreadPoolExecutor.CallerRunsPolicy()
);
// 3 個車主,分別駛入 3/3/1 輛
pool.submit(new CarOwner(park, 3));
pool.submit(new CarOwner(park, 3));
pool.submit(new CarOwner(park, 1));
// 3 個保安,分別駛出 1/2/1 輛
pool.submit(new Secure(park, 1));
pool.submit(new Secure(park, 2));
pool.submit(new Secure(park, 1));
pool.shutdown();
}
}
生產環境建議直接使用 BlockingQueue 實現生產消費,無需手動 wait/notify: