線程池解決頻繁創建銷毀線程開銷大、無限制創建導致 OOM 等核心問題。Java 5 Executors 工廠類提供四種經典線程池,本文逐一解析原理、代碼與適用場景。
public class MyThread extends Thread {
@Override public void run() {
System.out.println(Thread.currentThread().getName() + " 正在執行。。。");
}
}
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 提交 5 個任務
for (int i = 0; i < 5; i++) cachedThreadPool.execute(new MyThread());
cachedThreadPool.shutdown();
特點:無核心線程,最大 Integer.MAX_VALUE,空閒 60 秒回收。適用:短期異步任務量波動大、輕量級任務。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 固定 3 線程
// 提交 5 個任務,超出部分排隊等待
for (int i = 0; i < 5; i++) fixedThreadPool.execute(new MyThread());
fixedThreadPool.shutdown();
特點:核心=最大線程數,無界隊列。適用:長期任務、需嚴格控制併發數、服務器端穩定吞吐。
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(2);
scheduled.execute(new MyThread()); // 立即執行
scheduled.schedule(new MyThread(), 1000, TimeUnit.MILLISECONDS); // 延遲 1s
scheduled.scheduleAtFixedRate(task, 0, 10, TimeUnit.SECONDS); // 週期執行
scheduled.shutdown();
特點:支援延遲、定時、周期執行。適用:定時備份、心跳檢測、限流令牌桶補充等。
ExecutorService single = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) single.execute(new MyThread());
single.shutdown();
特點:唯一工作線程,任務 FIFO/LIFO/優先級隊列。適用:順序敏感操作、資源獨占訪問、事件分發循環。
| 線程池 | 核心線程 | 最大線程 | 隊列 | 典型場景 |
|---|---|---|---|---|
| Cached | 0 | 無界 | SynchronousQueue | 短時異步任務 |
| Fixed | N | N | LinkedBlockingQueue(無界) | 穩定併發服務 |
| Scheduled | N | 無界 | DelayedWorkQueue | 定時/周期任務 |
| Single | 1 | 1 | LinkedBlockingQueue | 串行順序執行 |
⚠️ 阿里巴巴開發手冊強制:不允許使用 Executors 創建線程池,需自定義
ThreadPoolExecutor明確指定參數,避免無界隊列導致 OOM。
// 生產級自定義示例
new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // 有界隊列
new ThreadFactoryBuilder().setNameFormat("biz-%d").build(),
new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);
理解四大類型原理是掌握自定義線程池的基礎,實戰中請根據業務 QPS、延遲敏感度、任務類型精細配置七大參數。