Spring 通過 "任務(wù)執(zhí)行器" (TaskExecutor) 來實現(xiàn)多線程和并發(fā)編程 , 一般使用ThreadPoolTaskExecutor 可以實現(xiàn)一個基于線程池的 TaskExecutor 。
而實際開發(fā)任務(wù)中一般是非阻礙的,就是異步的,所以我們要在配置類中通過 @EnableAsync 開啟對異步任務(wù)的支持 , 并通過在實際執(zhí)行的 Bean 的方法中使用 @Async 注解來聲明他是一個一部任務(wù)
配置類
@Configuration
@ComponentScan("com.wangzai.springboot.thread.async")
//開啟異步支持
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
//實現(xiàn)AsyncConfigurer 并重寫getAsyncExecutor返回一個ThreadPoolTaskExecutor 這樣我們就獲得了一個基于線程池TaskExecutor
@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;
}
}
執(zhí)行類
@Service
public class AsyncTaskService {
//通過@Async表明該方法是一個異步方法,如果注解在類級別,則表明該類所有的方法都是異步方法,這里的方法自動被注入使用ThreadPoolTaskExecutor 作為 TaskExecutor。
@Async
public void executeAsyncTask(Integer i) {
System.out.println("執(zhí)行異步任務(wù)" + i);
}
@Async
public void executeAsyncTaskPlus(Integer i ) {
System.out.println("執(zhí)行任務(wù) + 1" + (i+1));
}
}
啟動器
public class ApplicationAsync {
public static void main(String[] args) {
//我們加載配置 , 就是我們剛才配置了異步和Bean的類 ,這樣我們異步啟動了
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
//我們這里用剛才獲取的Context來獲取AsyncTask 這個時候異步配置已經(jīng)開啟啦~
AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
for (int i = 0 ; i < 10 ; i ++) {
asyncTaskService.executeAsyncTask(i);
asyncTaskService.executeAsyncTaskPlus(i);
}
context.close();
}
}
添加了異步注解,我們在執(zhí)行的時候 for () 循環(huán)10次 , 那就是20個并發(fā),效果:
執(zhí)行任務(wù) +1 :1
執(zhí)行異步任務(wù)1
執(zhí)行異步任務(wù)3
執(zhí)行任務(wù) +1 :4
執(zhí)行異步任務(wù)4
執(zhí)行任務(wù) +1 :5
執(zhí)行異步任務(wù)5
執(zhí)行任務(wù) +1 :6
執(zhí)行異步任務(wù)6
執(zhí)行任務(wù) +1 :7
執(zhí)行異步任務(wù)7
執(zhí)行任務(wù) +1 :8
執(zhí)行異步任務(wù)8
執(zhí)行任務(wù) +1 :9
執(zhí)行異步任務(wù)9
執(zhí)行任務(wù) +1 :10
執(zhí)行異步任務(wù)2
執(zhí)行任務(wù) +1 :2
執(zhí)行異步任務(wù)0
執(zhí)行任務(wù) +1 :3