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

Java 線程池深度解析:ThreadPoolExecutor 核心參數、隊列選擇、拒絕策略與自定義擴展

     編輯:Java 綜合教學

Java 線程池深度解析:ThreadPoolExecutor 核心參數、隊列選擇、拒絕策略與自定義擴展

Java 線程池深度解析:ThreadPoolExecutor 核心參數、隊列選擇、拒絕策略與自定義擴展

頻繁創建銷毀線程開銷大,線程池實現線程復用,java.util.concurrent.Executors 提供工廠方法,ThreadPoolExecutor 為核心實現。本文系統剖析其參數、隊列、拒絕策略、自定義與擴展機制。

Executors 快速上手

ExecutorService executor = Executors.newFixedThreadPool(5); // 固定 5 線程
for (int i = 0; i < 10; i++) {
    final int no = i;
    executor.execute(() -> {
        System.out.println("into" + no);
        Thread.sleep(1000);
        System.out.println("end" + no);
    });
}
executor.shutdown(); // 禁止新任務,等待執行完畢

運行結果顯示任意時刻最多 5 線程並發,體現線程復用。

Executors 提供的四大線程池

方法特點適用場景
newFixedThreadPool(n)核心=最大=n,無界隊列長期任務,控制並發度
newCachedThreadPool()核心 0,最大 Integer.MAX_VALUE,60s 空閒回收,同步隊列大量短期異步任務
newSingleThreadExecutor()單線程串行,無界隊列順序執行任務
newScheduledThreadPool(n)支持定時/周期任務定時調度

ThreadPoolExecutor 七大核心參數

public ThreadPoolExecutor(
    int corePoolSize,      // 核心線程數
    int maximumPoolSize,   // 最大線程數
    long keepAliveTime,    // 非核心線程空閒存活時間
    TimeUnit unit,         // 時間單位
    BlockingQueue<Runnable> workQueue, // 任務隊列
    ThreadFactory threadFactory,       // 線程工廠
    RejectedExecutionHandler handler   // 拒絕策略
)

任務執行流程

  1. 線程數 < corePoolSize → 創建核心線程執行。
  2. 線程數 ≥ corePoolSize → 任務入隊 workQueue。
  3. 隊列滿且線程數 < maximumPoolSize → 創建非核心線程執行。
  4. 線程數 ≥ maximumPoolSize 且隊列滿 → handler 處理拒絕。
  5. 非核心線程空閒超過 keepAliveTime → 回收。

常用阻塞隊列選型

  • ArrayBlockingQueue:有界數組隊列,FIFO,固定大小。
  • LinkedBlockingQueue:無界鏈表隊列(默認),FIFO,FixedThreadPool 默認使用。
  • SynchronousQueue:零容量直接遞交隊列,CachedThreadPool 默認使用,生產者等待消費者。
  • PriorityBlockingQueue:優先級隊列,任務需實現 Comparable。

SynchronousQueue 示例:串行遞交

SynchronousQueue<String> sq = new SynchronousQueue<>();
Semaphore sem = new Semaphore(1); // 互斥鎖
// 10 消費者
for (int i=0;i<10;i++) new Thread(() -> {
    sem.acquire();
    String input = sq.take(); // 阻塞等待
    System.out.println(Thread.currentThread().getName() + ":" + TestDo.doSome(input));
    sem.release();
}).start();
// 10 生產者
for (int i=0;i<10;i++) sq.put(i + "");

輸出嚴格串行,前一任務結束後下一任務開始。

四大內置拒絕策略

自定義策略實現 RejectedExecutionHandler 接口,可記錄日志、報警、持久化等。

自定義線程池:參數化與封裝

ThreadPoolExecutor pool = new ThreadPoolExecutor(
    10, 30, 30, TimeUnit.MINUTES,
    new ArrayBlockingQueue<>(10),
    new CustomThreadFactory(),      // 命名前綴+原子計數
    new CustomRejectedHandler()     // 記錄/報警
);

擴展鉤子方法

  • beforeExecute(Thread t, Runnable r):任務執行前,可記錄開始時間、設置上下文。
  • afterExecute(Runnable r, Throwable t):任務執行後,可統計耗時、處理異常、清理資源。
  • terminated():線程池完全終止時調用,可釋放全局資源。

源碼層級關係圖

Executor (interface)
  └── execute(Runnable)
ExecutorService (interface) extends Executor
  └── shutdown, submit, invokeAll...
AbstractExecutorService implements ExecutorService
  └── 模板方法實現 submit/invokeAll
ThreadPoolExecutor extends AbstractExecutorService
  └── 核心實現
Executors (工具類)
  └── 靜態工廠方法返回 ExecutorService

ExecutorService 生命週期

  • RUNNING:接受新任務,處理隊列任務。
  • SHUTDOWN:shutdown(),不接受新任務,處理隊列任務。
  • STOP:shutdownNow(),不接受新任務,嘗試中斷執行中任務,返回未處理任務列表。
  • TIDYING:所有任務終止,terminated() 執行完畢。
  • TERMINATED:最終狀態。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略行為適用場景
AbortPolicy拋出 RejectedExecutionException關鍵業務,不可丟失,需立即發現
CallerRunsPolicy調用者線程直接執行任務緩衝峰值,利用調用者資源
DiscardPolicy默默丟棄任務非關鍵、可容忍丟失
DiscardOldestPolicy丟棄隊列頭部最老任務,重試提交優先處理新任務