ThreadPoolTaskExecutor和ThreadPoolExecutor有何區別?

瞭解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進行了封裝處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章