Spring Boot執行緒池配置使用
阿新 • • 發佈:2019-02-01
首先,我們要了解什麼是執行緒池,執行緒,大家應該都不陌生,我們可以把一個介面處理的單個任務當做一個執行緒,比如上傳檔案,呼叫介面,上傳檔案,上傳完成。 這時會初始化一個執行緒,等待上傳結束,執行緒銷燬 。 但是這樣會頻繁的建立銷燬執行緒,為了不浪費更多的系統資源,我們使用執行緒池概念,比如有有一個容器 我們初始化一部分核心執行緒,設定最大執行緒數,當客戶訪問我們的服務時,核心執行緒開始處理,處理完畢後不是銷燬而是再放回容器中,這樣就不會頻繁的建立銷燬執行緒,當我們設定的核心執行緒不夠使用時,會繼續建立執行緒,直至我們設定的最大執行緒數,例如,我們設定核心執行緒為10,最大執行緒數為100,那麼當連線到達100後就會拒絕連線,這樣也可以防止我們的系統遭受攻擊。當連線數降下來後,多餘的90個執行緒會在設定的時間內銷燬,來釋放系統資源,下面我們就來程式碼實現下:
環境: IDEA + SpringBoot
首先:建立一個類並實現 AsyncConfigurer 介面,然後在這個類上加上 @Component 註解,以便在啟動專案時被掃描到
@Component public class ThreadAsyncConfigurer implements AsyncConfigurer { @Bean public Executor getAsyncExecutor() { ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor(); //設定核心執行緒數 threadPool.setCorePoolSize(10); //設定最大執行緒數 threadPool.setMaxPoolSize(100); //執行緒池所使用的緩衝佇列 threadPool.setQueueCapacity(10); //等待任務在關機時完成--表明等待所有執行緒執行完 threadPool.setWaitForTasksToCompleteOnShutdown(true); // 等待時間 (預設為0,此時立即停止),並沒等待xx秒後強制停止 threadPool.setAwaitTerminationSeconds(60); // 執行緒名稱字首 threadPool.setThreadNamePrefix("MyAsync-"); // 初始化執行緒 threadPool.initialize(); return threadPool; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
第二步:在SpringBoot啟動類 Application 上加上 @EnableAsync 註解
@SpringBootApplication
@EnableAsync //執行緒池註解
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
第三步:在Service 層的方法上加上 @Async 註解
這樣執行緒池就實現了,是不是很簡單呢,個人理解,如有錯誤,還望大神指正@Service public class FileService { //測試執行緒池 @Async public void testthread(){ System.out.println("執行緒名稱:"+Thread.currentThread().getName()); }