Spring Boot使用多執行緒
阿新 • • 發佈:2019-01-02
引言:Spring作為容器為我們託管物件,但是有時我們需要多執行緒執行任務,那麼我們該如何配置呢?
解決:利用java的執行緒池Executor執行任務
步驟
1.配置TaskExecutor
這裡直接將執行緒池注入
CorePoolSize代表執行任務的執行緒數量
public class TaskExecutorConfig implements AsyncConfigurer{//實現AsyncConfigurer介面 @Bean public Executor getAsyncExecutor() {//實現AsyncConfigurer介面並重寫getAsyncExecutor方法,並返回一個ThreadPoolTaskExecutor,這樣我們就獲得了一個基於執行緒池TaskExecutor這裡我們得到了一個基於java的執行緒池Executer的執行緒池,然後設定了部分引數,返回了一個例項ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
2.編寫我們需要執行的任務,並註明service
@Service @Slf4j public class AsyncTaskService { @Async public void dataTranslate(int i) { log.info("啟動了執行緒"+i); } }
這裡用日誌列印
3.將執行緒池物件注入,並呼叫任務service。
最後在application中開始非同步支援@EnableAsync
呼叫結果:可以看到,是不同的執行緒執行了列印任務,而且根據cpu時間片,搶佔,可以看到執行緒執行順序也發生了變化,說明是非同步執行
總結:Spring Boot對多執行緒的支援和Spring沒什麼兩樣,就是需要先配置執行緒池,然後注入bean,再寫非同步方法,最後呼叫就可以了。
關於多執行緒中還有許多問題,如執行緒同步等就需要在寫程式碼時多注意多思考了。另外,合理配置執行緒池引數也很重要