背景
Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程的,Spring使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor,在实际开发中,现在的多线程都是异步非阻塞的,所以我们在配置类中需要加上@EnableAsync注解,开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。
使用实例
配置类
@Configuration
@ComponentScan("com.example.demo.test.taskExecutor")
@EnableAsync// 开启对异步的支持
public class TaskExecutorConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(4);
taskExecutor.setMaxPoolSize(20);
taskExecutor.setQueueCapacity(30);
taskExecutor.initialize();
return taskExecutor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
上面的配置类中: 加了@EnableAsync注解,表示开启对异步任务的支持。
但是对异步任务的支持需要基于线程池,所以实现了AsyncConfigurer接口,通过重写 getAsyncExecutor() 方法,获得一个Spring的ThreadPoolTaskExecutor线程池,为异步方法实现提供支持。
异步方法执行类
@Service
public class AsyncExecutorTaskService {
@Async
public void executeAsyncTask1(Integer i){
System.out.println("task1: 执行异步任务: "+i);
}
@Async
public void executeAsyncTask2(Integer i){
System.out.println("task2: 执行异步任务: "+ i);
}
}
通过 @Async 注解标识这是一个异步任务,这个注解也可以放在类上面,那么这个类的所有方法都是一步方法。
启动类
public class APP {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
AsyncExecutorTaskService asyncTaskService = context.getBean(AsyncExecutorTaskService.class);
for(int i =1 ;i<=20; i++){
asyncTaskService.executeAsyncTask1(i);
asyncTaskService.executeAsyncTask2(i);
}
context.close();
}
}
运行结果: