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

Java 線程池全解析:四大預設實現、ThreadPoolExecutor 參數詳解與拒絕策略

     編輯:Java 相關知識

Executors 四大預設線程池

Executors 工廠類提供四種常用線程池,底層皆為 ThreadPoolExecutor,參數組合不同:

線程池類型核心/最大線程數隊列類型適用場景
newFixedThreadPool(n)n / nLinkedBlockingQueue(無界)穩定固定併發、長期運行任務、伺服器端
newCachedThreadPool()0 / Integer.MAX_VALUESynchronousQueue(直接移交)短生命周期、異步任務、任務量波動大
newSingleThreadExecutor()1 / 1LinkedBlockingQueue(無界)需序列化執行、單線程串行化
newScheduledThreadPool(n)n / nDelayedWorkQueue定時、周期性任務

ThreadPoolExecutor 七大核心參數

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

關鍵參數交互邏輯(以 LinkedBlockingQueue(10) 為例)

  1. 執行中線程 < corePoolSize → 直接創建核心線程執行。
  2. 核心線程已滿 → 任務入隊 workQueue。
  3. 隊列已滿 且 執行中線程 < maximumPoolSize → 創建非核心線程執行。
  4. 隊列滿 + 線程達 maximumPoolSize → 觸發 RejectedExecutionHandler。

四種內建拒絕策略

  • AbortPolicy(預設):拋出 RejectedExecutionException。
  • CallerRunsPolicy:由呼叫執行緒(提交任務的線程)直接執行任務,提供「背壓」效果。
  • DiscardPolicy:靜默丟棄任務,不拋異常。
  • DiscardOldestPolicy:丟棄隊列頭部最老任務,嘗試重新提交當前任務。

自訂線程池最佳實踐

// CPU 密集型:核心數 = CPU 核心數 + 1
// IO 密集型:核心數 = CPU 核心數 * (1 + 平均等待時間/平均工作時間)
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    4, 8, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(100),
    new ThreadFactoryBuilder().setNameFormat("biz-worker-%d").build(),
    new ThreadPoolExecutor.CallerRunsPolicy() // 推薦:背壓保護
);

總結

理解線程池參數交互關係與拒絕策略,避免盲目使用 Executors 預設池(無界隊列易導致 OOM),根據業務屬性(CPU/IO 密集)合理配置核心數、隊列大小與拒絕策略,構建穩健的併發系統。

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