【JAVA】springboot2 中自定義多個線程池實現異步處理引入ThreadPoolExecutor的內部執行原理

無意中發現了一個巨牛的人工智能教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看小說一樣!覺得太牛了,所以分享給大家。點這裏可以跳轉到教程。

 

springboot2中線程池的定義

@Configuration
public class ThreadPoolConfig {

	@Bean
	public Executor logExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setThreadNamePrefix("myLog-");
		executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
		return executor;
	}

	@Bean
	public Executor bizExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.setThreadNamePrefix("myBiz-");
		executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() << 1 + 1);
		executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
		return executor;
	}

}

如上,定義了兩個線程池,線程池中線程名字的前綴自定義,設置了線程池大小和核心線程數,這裏其實可以繼續設置其它參數,入拒絕策略,線程池中任務隊列大小等

ThreadPoolTaskExecutor 這個類是springboot中的,其實它內部使用的也是ThreadPoolExecutor,大家自定義線程池也都是通過ThreadPoolExecutor來做的,所以都逃不掉這個類。

可以看到最終提交任務給線程池工作的時候也是通過JDK的ExecutorService去提交的。

異步執行

有了上面的基於springboot2的線程池自定義,那麼異步任務如何實現?

通過Async註解來標明該方法的異步執行,括號內的bizExecutor就是我們自定義線程池的方法名,表明該異步執行的任務通過哪個線程池來完成。

ThreadPoolExecutor原理

 

 

corePoolSize

線程池的核心線程數,最小線程數

maximumPoolSize

線程池中最大線程數

keepAliveTime

超過core數量的空閒線程的存活時間,超過則被銷燬

unit

時間單位

workQueue

阻塞隊列,用來保存等待執行的任務

threadFactory

線程工廠,創建線程時的自定義方法,比如線程名,定位問題方便查找

handler

線程池滿或隊列滿時的拒絕執行策略

 

整個線程池原型的原理總結如下:

 

 

 

 

 

 

 

 

 

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