首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 線程池全解析:四大類型、適用場景與代碼實戰

     編輯:Java 綜合教學

Java 線程池全解析:四大類型、適用場景與代碼實戰

線程池解決頻繁創建銷毀線程開銷大、無限制創建導致 OOM 等核心問題。Java 5 Executors 工廠類提供四種經典線程池,本文逐一解析原理、代碼與適用場景。

測試用任務類

public class MyThread extends Thread {
    @Override public void run() {
        System.out.println(Thread.currentThread().getName() + " 正在執行。。。");
    }
}

1. newCachedThreadPool — 可變尺寸、按需創建

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 提交 5 個任務
for (int i = 0; i < 5; i++) cachedThreadPool.execute(new MyThread());
cachedThreadPool.shutdown();
CachedThreadPool運行結果:5個線程並發執行

特點:無核心線程,最大 Integer.MAX_VALUE,空閒 60 秒回收。適用:短期異步任務量波動大、輕量級任務。

2. newFixedThreadPool — 定長、控制併發上限

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 固定 3 線程
// 提交 5 個任務,超出部分排隊等待
for (int i = 0; i < 5; i++) fixedThreadPool.execute(new MyThread());
fixedThreadPool.shutdown();
FixedThreadPool運行結果:僅3個線程並發,其餘等待

特點:核心=最大線程數,無界隊列。適用:長期任務、需嚴格控制併發數、服務器端穩定吞吐。

3. newScheduledThreadPool — 定時/周期性任務

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();
ScheduledThreadPool運行結果

特點:支援延遲、定時、周期執行。適用:定時備份、心跳檢測、限流令牌桶補充等。

4. newSingleThreadExecutor — 單線程串行、保證順序

ExecutorService single = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) single.execute(new MyThread());
single.shutdown();
SingleThreadExecutor運行結果:任務按順序串行執行

特點:唯一工作線程,任務 FIFO/LIFO/優先級隊列。適用:順序敏感操作、資源獨占訪問、事件分發循環。

核心優勢總結

線程池核心線程最大線程隊列典型場景
Cached0無界SynchronousQueue短時異步任務
FixedNNLinkedBlockingQueue(無界)穩定併發服務
ScheduledN無界DelayedWorkQueue定時/周期任務
Single11LinkedBlockingQueue串行順序執行

生產環境建議

⚠️ 阿里巴巴開發手冊強制:不允許使用 Executors 創建線程池,需自定義 ThreadPoolExecutor 明確指定參數,避免無界隊列導致 OOM。

// 生產級自定義示例
new ThreadPoolExecutor(
    corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100), // 有界隊列
    new ThreadFactoryBuilder().setNameFormat("biz-%d").build(),
    new ThreadPoolExecutor.AbortPolicy() // 拒絕策略
);

理解四大類型原理是掌握自定義線程池的基礎,實戰中請根據業務 QPS、延遲敏感度、任務類型精細配置七大參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved