頻繁創建/銷毀線程開銷巨大,JDK 5 引入 Executor 框架,將「任務提交」與「任務執行」解耦,底層基於線程池實現,提供線程生命週期管理、任務隊列、拒絕策略等企業級能力,同時避免 this 逃逸風險。
Runnable(無返回值)、Callable<V>(有返回值、可拋異常)Executor(單方法 execute)、ExecutorService(繼承 Executor,提供 submit、shutdown、invokeAll 等豐富管理方法)Executors 快速創建常用線程池Future<V> 代表異步計算結果,FutureTask 同時實現 Runnable 和 FutureThreadPoolExecutor、ScheduledThreadPoolExecutorExecutor 將任務映射到固定數量的 Java 線程| 工廠方法 | 底層實現 | 特點 | 適用場景 |
|---|---|---|---|
newFixedThreadPool(n) | ThreadPoolExecutor(n, n, 0L, LinkedBlockingQueue) | 核心=最大=n,無界隊列,線程數固定 | 長生命周期任務、負載較重的穩定服務、需限制併發數 |
newSingleThreadExecutor() | ThreadPoolExecutor(1, 1, 0L, LinkedBlockingQueue) | 單線程串行執行,保證任務順序 | 需嚴格順序執行、無併發衝突的場景 |
newCachedThreadPool() | ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, SynchronousQueue) | 核心=0,最大無界,60s 空閒回收,直接移交隊列 | 大量短生命周期異步任務、輕負載服務 |
newScheduledThreadPool(n) | ScheduledThreadPoolExecutor (DelayQueue) | 支援定時/周期任務,可替代 Timer | 定時任務、周期性作業、延遲執行 |
public ThreadPoolExecutor(
int corePoolSize, // 核心線程數(常駐)
int maximumPoolSize, // 最大線程數(峰值)
long keepAliveTime, // 非核心線程空閒存活時間
TimeUnit unit, // 時間單位
BlockingQueue workQueue, // 任務隊列
ThreadFactory factory, // 線程工廠(命名、守護屬性等)
RejectedExecutionHandler handler // 拒絕策略
)
執行流程:
workQueueRejectedExecutionHandler常見拒絕策略:AbortPolicy(拋異常,默認)、CallerRunsPolicy(調用者執行)、DiscardPolicy(靜默丟棄)、DiscardOldestPolicy(丟棄最舊任務)。
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
executor.execute(() -> System.out.println(Thread.currentThread().getName() + " is running"));
}
executor.shutdown(); // 平滑關閉:不接受新任務,等待已提交任務完成
ExecutorService executor = Executors.newCachedThreadPool(); List> futures = new ArrayList<>(); for (int i = 0; i < 5; i++) { final int id = i; futures.add(executor.submit(() -> { System.out.println(Thread.currentThread().getName() + " call method"); return "Result-" + id; })); } for (Future f : futures) { try { System.out.println(f.get()); // 阻塞直到結果返回 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } executor.shutdown();
LinkedBlockingQueue → 任務堆積風險(OOM),但線程數固定,資源可控SynchronousQueue 直接移交,無隊列緩衝ThreadPoolExecutor,使用 DelayQueue 存放 ScheduledFutureTasktime(執行時間)、period(周期)、sequenceNumber(序號)Timer,支援多線程並發定時任務,異常不影響其他任務ThreadPoolExecutor 明確參數,避免 OOMCallerRunsPolicy 實現「削峰填谷」背壓ThreadFactory 設置有意義名稱(如 order-process-%d),便於排查問題shutdown() + awaitTermination(timeout),處理未完成任務Executor 框架是 Java 併發編程的「瑞士軍刀」。理解 ThreadPoolExecutor 參數交互、隊列選型、拒絕策略,並根據業務特性(CPU/IO、延遲敏感度、吞吐要求)定制線程池,是構建高性能、穩定 Java 服務的必修課。