1. 程式人生 > >SpringBoot實現多執行緒

SpringBoot實現多執行緒

一.配置多執行緒》在配置/啟動類上添加註解開啟非同步支援:@EnableAsync》在需要執行非同步的方法上新增非同步方法註解:@Async,通過@Async註解表明該方法是一個非同步方法,如果註解在類級別,表明該類下所有方法都是非同步方法,程式碼如下
@Service
public class AsyncTaskService {

    @Async 
    public void executeAsyncTask(Integer i){
        System.out.println("執行非同步任務:" + i);
    }
}
二.配置執行緒池配置類實現AsyncConfigurer介面,同時在此類新增開啟非同步支援的註解,重寫getAsyncExecutor方法,配置最小/大執行緒數量,以及等待佇列,程式碼如下
@Configuration
//開啟非同步支援
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);// 最小執行緒數
        taskExecutor.setMaxPoolSize(10);// 最大執行緒數
        taskExecutor.setQueueCapacity(25);// 等待佇列

        taskExecutor.initialize();

        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}
ThredPoolTaskExcutor的處理流程當池子大小小於corePoolSize,就新建執行緒,並處理請求當池子大小等於corePoolSize,把請求放入workQueue中,池子裡的空閒執行緒就去workQueue中取任務並處理當workQueue放不下任務時,就新建執行緒入池,並處理請求,如果池子大小撐到了maximumPoolSize,就用RejectedExecutionHandler來做拒絕處理當池子的執行緒數大於corePoolSize時,多餘的執行緒會等待keepAliveTime長時間,如果無請求可處理就自行銷燬三.啟動除錯(省略main方法)
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncTaskConfig.class);
AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
for(int i = 0; i < 10; i++){
      asyncTaskService.executeAsyncTask(i);
}