SpringBoot@Async註解配置

一、話不多說,上代碼

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
public class LianAsyncConfig implements AsyncConfigurer {

    /*獲取當前系統的CPU數,根據CPU數初始化線程*/
    private static final int PROCESSORS_COUNT = Runtime.getRuntime().availableProcessors();

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        // <核心線程數>線程池創建時候初始化的線程數
        threadPool.setCorePoolSize(PROCESSORS_COUNT);
        // <最大線程數>線程池最大的線程數,只有在<緩衝隊列數>滿了之後纔會申請超過核心線程數的線程
        threadPool.setMaxPoolSize(PROCESSORS_COUNT * 2);
        // <緩衝隊列數>線程池所使用的緩衝隊列
        threadPool.setQueueCapacity(PROCESSORS_COUNT * 100);
        // 當線程數超過最大線程數時,處理方式
        // new ThreadPoolExecutor.AbortPolicy():丟棄任務並拋出RejectedExecutionException異常
        // new ThreadPoolExecutor.DiscardPolicy():也是丟棄任務,但是不拋出異常
        // new ThreadPoolExecutor.DiscardOldestPolicy():丟棄<緩衝隊列數>最前面的任務,然後重新嘗試執行任務
        // new ThreadPoolExecutor.CallerRunsPolicy():由調用線程處理該任務,一般會阻塞,說白了就是沒有線程作用~
        threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // <核心線程數>之外的線程在空閒時間60秒到達之後會被銷燬
        threadPool.setKeepAliveSeconds(60);
		// <核心線程數>之外的線程在存活時間10分鐘到達之後會被銷燬
        threadPool.setAwaitTerminationSeconds(10 * 60);
        // 線程池關閉的時候等待所有任務都完成再繼續銷燬其他的Bean,這樣這些異步任務的銷燬就會先於Redis線程池的銷燬。
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        // 線程前綴
        threadPool.setThreadNamePrefix("LianAsync-");
        //初始化線程
        threadPool.initialize();
        return threadPool;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章