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

Java Executor 並發框架 (一) - 線程池核心架構與 ThreadPoolExecutor 深度解析

     編輯:Java 綜合教學

從 Executors 工廠到 ThreadPoolExecutor 核心參數:Java 線程池完全指南

JDK 1.5 引入 java.util.concurrent 包,提供了工業級的線程池實現。本文系統介紹 Executor 體系架構、Executors 四大預置線程池、ThreadPoolExecutor 七大核心參數與拒絕策略,助你根據業務場景選擇最優配置。

一、核心接口體系

Executor (頂層,單方法 execute(Runnable))
  ↑
ExecutorService (繼承,添加 submit/shutdown 等生命周期管理)
  ↑
ThreadPoolExecutor (默認實現,核心邏輯)
  ↑
ScheduledThreadPoolExecutor (繼承,支援定時/周期任務)

關鍵點:Executor 只是執行工具,真正的線程池接口是 ExecutorService。

二、Executors 四大工廠方法與適用場景

方法特點底層參數適用場景
newSingleThreadExecutor()單線程串行,保證任務順序core=max=1, 無界隊列順序執行、無併發需求的任務
newFixedThreadPool(n)固定大小,超出排隊core=max=n, 無界隊列長期運行、負載穩定的業務
newCachedThreadPool()可緩存,閒置 60s 回收,上限 Integer.MAX_VALUEcore=0, max=MAX, SynchronousQueue短耗時、突發性高併發任務
newScheduledThreadPool(n)支援定時/周期調度ScheduledExecutorService 實現定時任務、心跳檢測、定時清理

代碼驗證:文中附帶 Lambda + Stream 測試代碼,輸出線程名證明各池行為差異。

三、ThreadPoolExecutor 七大核心參數詳解

public ThreadPoolExecutor(
    int corePoolSize,           // 核心線程數:池中長期保持的線程數
    int maximumPoolSize,        // 最大線程數:高負載時可膨脹的上限
    long keepAliveTime,         // 非核心線程閒置存活時間
    TimeUnit unit,              // 時間單位
    BlockingQueue<Runnable> workQueue, // 任務隊列:關鍵影響排隊策略
    ThreadFactory threadFactory,       // 線程創建工廠(可命名、設置守護線程)
    RejectedExecutionHandler handler   // 拒絕策略:隊列滿且線程達最大時觸發
)

隊列選型影響巨大

  • LinkedBlockingQueue:無界隊列,maximumPoolSize 失效,任務全進隊列(Fixed/Single 底層使用)。
  • ArrayBlockingQueue:有界隊列,需配合 maximumPoolSize 實現「隊列滿→擴線程→再滿→拒絕」完整邏輯。
  • SynchronousQueue:直傳隊列(容量 0),任務必須有線程立即消費,否則阻塞(Cached 底層使用)。

四大拒絕策略

四、Executors 預置池的底層參數映射

// FixedThreadPool:core=max=n, keepAlive=0, LinkedBlockingQueue
new ThreadPoolExecutor(n, n, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());

// SingleThreadExecutor:core=max=1, 同 Fixed,包裝 FinalizableDelegatedExecutorService
// CachedThreadPool:core=0, max=MAX, keepAlive=60s, SynchronousQueue
new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<>());

官方建議:優先使用 Executors 工廠方法,滿足大多數場景;特殊需求(如有界隊列、自定義拒絕策略)再手動構建 ThreadPoolExecutor。

五、關鍵方法與關閉流程

  • execute(Runnable):核心提交入口,無返回值。
  • submit(Callable):返回 Future 可獲取結果/異常,內部轉調 execute。
  • shutdown():優雅關閉,不再接受新任務,等待隊列任務完成。
  • shutdownNow():嘗試中斷執行中任務,返回未執行任務列表。

生產環境建議:shutdown() + awaitTermination(timeout) + 超時則 shutdownNow()。

總結

理解 ThreadPoolExecutor 參數交互關係(尤其是隊列與線程數的動態平衡),是排查線程池積壓、OOM、任務丟失等生產事故的前提。下一篇將深入 Future、CompletableFuture 異步編程模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略行為
AbortPolicy (默認)拋出 RejectedExecutionException
DiscardPolicy靜默丟棄任務
DiscardOldestPolicy丟棄隊頭最老任務,重試提交
CallerRunsPolicy由調用線程同步執行任務(背壓)