1. 程式人生 > >Spring Boot使用多執行緒

Spring Boot使用多執行緒

引言:Spring作為容器為我們託管物件,但是有時我們需要多執行緒執行任務,那麼我們該如何配置呢?

解決:利用java的執行緒池Executor執行任務

步驟


1.配置TaskExecutor

這裡直接將執行緒池注入

CorePoolSize代表執行任務的執行緒數量

public class TaskExecutorConfig implements AsyncConfigurer{//實現AsyncConfigurer介面

    @Bean
    public Executor getAsyncExecutor() {//實現AsyncConfigurer介面並重寫getAsyncExecutor方法,並返回一個ThreadPoolTaskExecutor,這樣我們就獲得了一個基於執行緒池TaskExecutor
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
這裡我們得到了一個基於java的執行緒池Executer的執行緒池,然後設定了部分引數,返回了一個例項


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,再寫非同步方法,最後呼叫就可以了。

關於多執行緒中還有許多問題,如執行緒同步等就需要在寫程式碼時多注意多思考了。另外,合理配置執行緒池引數也很重要