springboot學習筆記 線程池的使用和自定義配置


springboot默認線程池簡單實現

1.使用方法在spring boot的啟動類上加上@EnableAsync注解,表示項目支持異步方法調用

2.在需要異步調用的方法上添加@Async注解,表示該方法為異步方法,即該方法和調用者不在一個線程中進行如果需要返回值

1、判斷核心線程池是否已滿,如果不是,則創建線程執行任務
2、如果核心線程池滿了,判斷隊列是否滿了,如果隊列沒滿,將任務放在隊列中
3、如果隊列滿了,則判斷線程池是否已滿,如果沒滿,創建線程執行任務
4、如果線程池也滿了,則按照拒絕策略對任務進行處理
對於spring框架中線程池配置參數的涵義,可以參考ThreadPoolExecutor對象中的解釋。
說明:對於@Async注解默認會基於ThreadPoolTaskExecutor對象獲取工作線程,然后調用由@Async描述的方法,讓方法運行於一個工作線程,以實現異步操作。但是假如系統中的默認拒絕處理策略,任務執行過程的異常處理不能滿足我們自身業務需求的話,我可以對異步線程池進行自定義.(SpringBoot中默認的異步配置可以參考自動配置對象TaskExecutionAutoConfiguration).

簡單配置

或者通過自定義配置類的方式實現

1、 核心參數介紹

1、CorePoolSize:核心線程數,核心線程會一直存活,即使沒有任務
2、MaxPoolSize:線程池中的最大線程數
3、QueueCapacity:阻塞隊列的容量,用來存儲等待執行的任務
4、KeepAliveSeconds:線程空閑時間
5、RejectedExecutionHandler:拒絕策略

2、為了讓Spring中的異步池更好的服務於我們的業務,同時也盡量避免OOM,可以自定義線程池優化設計如下:關鍵代碼如下:


@Slf4j
@Setter
@Configuration
@ConfigurationProperties("async-thread-pool")
public class SpringAsyncConfig implements AsyncConfigurer{
    /**核心線程數*/
	private int corePoolSize=20;
	/**最大線程數*/
	private int maximumPoolSize=1000;
	/**線程空閑時間*/
	private int keepAliveTime=30;
	/**阻塞隊列容量*/
	private int queueCapacity=200;
	/**構建線程工廠*/
	private ThreadFactory threadFactory=new ThreadFactory() {
		//CAS算法
		private AtomicInteger at=new AtomicInteger(1000);
		@Override
		public Thread newThread(Runnable r) {
			return new Thread(r, 
"async-thread-"+at.getAndIncrement());
		}
	};	
	@Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maximumPoolSize);
        executor.setKeepAliveSeconds(keepAliveTime);
        executor.setQueueCapacity(queueCapacity);
        executor.setRejectedExecutionHandler((Runnable r, 
 ThreadPoolExecutor exe) -> {
                log.warn("當前任務線程池隊列已滿.");
        });
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler 
getAsyncUncaughtExceptionHandler() {
        return new AsyncUncaughtExceptionHandler() {
            @Override
            public void handleUncaughtException(Throwable ex ,
 Method method , Object... params) {
                log.error("線程池執行任務發生未知異常.", ex);
            }
        };
    }}


其中:@ConfigurationProperties("async-thread-pool")的含義是讀取application.yml配置文件中以"async-thread-pool"名為前綴的配置信息,並通過所描述類的set方法賦值給對應的屬性,在application.yml中連接器池的關鍵配置如下:


async-thread-pool:
       corePoolSize: 20
       maxPoolSize: 1000
       keepAliveSeconds: 30
       queueCapacity: 1000

后續在業務類中,假如我們使用@Async注解描述業務方法,默認會使用ThreadPoolTaskExecutor池對象中的線程執行異步任務


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM