瞭解ThreadPoolTaskExecutor之前我們先來了解下ThreadPoolExecutor的表圖,如下
ThreadPoolExecutor表圖
ThreadPoolExecutor重要參數
// 表示常駐核心線程數。如果等於0,則執行完任務之後,沒有任何請求進入時銷燬線程池的線程;如果大於0,即使本地任務執行完,核心線程也不會被銷燬。這個值非常關鍵,設置過大會浪費資源,過小會導致線程頻繁的創建或銷燬。
private int corePoolSize;
// 表示線程池能夠同時執行的最大線程數,這個值必須大於1,如果執行的線程數大於此值,則需要藉助第5個參數的幫助,緩存在隊列中。如果maximumPoolSize與corePoolSize相等,即是固定大小的線程池。
private int maximumPoolSize;
// 表示線程池中的線程空閒時間,當空閒時間達到keepAliveTime值時,線程會被銷燬,直至剩下corePoolSize個線程爲止,避免浪費內存和句柄資源。在默認情況下,當線程池中的線程數大於corePoolSize時,keepAliveTime纔會起作用。但是當ThreadPoolExecutor的allowCoreThreadTimeOut變量值設爲true時,核心線程超時後也會被收回。
private long keepAliveTime;
// 表示時間單位。keepAliveTime 的時間單位通常時TimeUnit.SECONDS.
private TimeUnit unit;
// 表示緩存隊列。當請求的線程數大於maximumPoolSize時,線程進入BlockingQueue阻塞隊列。
private BlockingQueue<Runnable> workQueue;
// 表示線程工廠。他用來生產一組相同任務的線程。線程池的命名是通過給這個factory增加組名前綴名來實現的。在虛擬機棧分析時就可以知道線程任務是有哪個線程工廠來產生的。
private ThreadFactory threadFactory;
// 表示執行拒絕策略的對象。當超過第5個參數workQueue的任務緩存區上限時,就可以通過該策略處理對象,這是一種簡單的限流保護。
private RejectedExecutionHandler handler;
更多關於ThreadPoolExecutor的介紹請參考記錄一次學習總結線程池原理與其API
**
ThreadPoolTaskExecutor表圖
**
ThreadPoolTaskExecutor跟ThreadPoolExecutor有個共同的特點,其祖宗接口都是Executor
ThreadPoolTaskExecutor重要參數
public class ThreadPoolTaskExecutor extends ExecutorConfigurationSupport
implements AsyncListenableTaskExecutor, SchedulingTaskExecutor {
private final Object poolSizeMonitor = new Object();
private int corePoolSize = 1;
private int maxPoolSize = Integer.MAX_VALUE;
private int keepAliveSeconds = 60;
// 緩存隊列(阻塞隊列)當核心線程數達到最大時,新任務會放在隊列中排隊等待執行
private int queueCapacity = Integer.MAX_VALUE;
// 允許核心線程超時
private boolean allowCoreThreadTimeOut = false;
@Nullable
private TaskDecorator taskDecorator;
@Nullable
private ThreadPoolExecutor threadPoolExecutor;
注意最後一個參數 ThreadPoolExecutor 有沒有很熟悉的感覺!ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是對ThreadPoolExecutor進行了封裝處理。