伺服器應用常面臨大量短小任務。若每請求建立一執行緒(thread-per-request),建立/銷毀開銷巨大,且活躍執行緒過多會導致記憶體耗盡或上下文切換過度。執行緒池透過重用執行緒、限制並發數、消除建立延遲解決上述問題。
newCachedThreadPool()ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 1; i <= 10; i++) {
final int taskId = i;
pool.execute(() -> {
for (int j = 1; j <= 10; j++) {
System.out.println(Thread.currentThread().getName() + " looping " + j + " task " + taskId);
try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
}
});
}
System.out.println("add all 10 tasks");
pool.shutdown();
newFixedThreadPool(int n)ExecutorService pool = Executors.newFixedThreadPool(3);
// 其餘程式碼同 cached,但同一時間僅 3 條執行緒同時運行
newSingleThreadExecutor()newScheduledThreadPool(int coreSize)// 6 秒後首次執行,之後每 2 秒執行一次
Executors.newScheduledThreadPool(3).scheduleAtFixedRate(() ->
System.out.println("booming"), 6, 2, TimeUnit.SECONDS);
ExecutorService:提交任務(execute(Runnable)、submit(Callable))、關閉(shutdown()、shutdownNow())、查狀態。ScheduledExecutorService:繼承上述,新增 schedule、scheduleAtFixedRate、scheduleWithFixedDelay。FixedThreadPool 使用無界隊列可能 OOM),建議自訂 ThreadPoolExecutor 參數:核心數、最大數、隊列型別、拒絕策略、執行緒工廠。Java 5 引入的 Executor 框架將執行緒管理與任務提交解耦,四大標準池覆蓋大多數場景。深入理解其底層參數與運作機制,並結合業務特性自訂配置,才能構建高效、穩定的併發系統。