- 我们在使用多线程的时候,往往需要创建Thread类,或者实现Runnable接口,如果要使用到线程池,我们还需要来创建Executors,在使用spring中,已经给我们做了很好的支持。
- 只要要@EnableAsync就可以使用多线程。使用@Async就可以定义一个线程任务。通过spring给我们提供的ThreadPoolTaskExecutor就可以使用线程池
- @EnableAsync作用于方法。表示开启对异步任务的支持,可以放在springboot的启动类上,也可以放在自定义线程池的配置类上
参数 |
描述 |
annotation |
指示要在类或方法级别检测到的“异步”注释类型 |
mode |
指示应如何应用异步建议 |
order |
指示应应用 AsyncAnnotationBeanPostProcessor 的顺序 |
proxyTargetClass |
指示是否要创建基于子类 (CGLIB) 的代理,而不是基于标准 Java 接口的代理。 |
- 如果配置了多个线程池,可以用@Async("name"),那么表示线程池的@Bean的name,来指定用哪个线程池处理
示例
- ThreadPoolTaskConfig.java
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {
private static final int corePoolSize = 10; // 核心线程数(默认线程数)
private static final int maxPoolSize = 100; // 最大线程数
private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒)
private static final int queueCapacity = 200; // 缓冲队列数
private static final String threadNamePrefix = "Async-Service-"; // 线程池名前缀
@Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
public ThreadPoolTaskExecutor getAsyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveTime);
executor.setThreadNamePrefix(threadNamePrefix);
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
}
- AsyncService.java
@Service public class testAsyncService{ Logger log = LoggerFactory.getLogger(testAsyncService.class);
// 发送提醒短信 1 @Async("taskExecutor") public void service1() throws InterruptedException { log.info("--------start-service1------------"); Thread.sleep(5000); // 模拟耗时 log.info("--------end-service1------------"); }
// 发送提醒短信 2 @Async("taskExecutor") public void service2() throws InterruptedException {
log.info("--------start-service2------------"); Thread.sleep(2000); // 模拟耗时 log.info("--------end-service2------------"); } } |
运行结果:
--------start-service1------------
--------start-service2------------
--------end-service2------------
--------end-service1------------