除了硬编码的异步编程处理方式, SpringBoot 框架还提供了 注解式
解决方案,以 方法体
为边界,方法体内部的代码逻辑全部按异步方式执行。
使用方法
@Async 注解使用时需要标注在方法上,来指明当前方法被调用时会异步执行。
需要注意的是,
- 使用该注解方法的类对象需要在 Spring Bean 中维护,否则注解不生效;
- 需要在启动类或配置类上使用 @EnableAsync 注解声明开启异步注解,否则 SpringBoot 不会去搜索 @Async 注解标注的方法
另外,@Async 注解直接使用时采用的是 SpringBoot 中默认的线程池对象,如想要指定线程池进行异步操作,可在 @Async 注解中指定:@Async("defaultThreadPoolExecutor")
,对应的线程池对象需要自己实现并加入到 SpringBean 中。
@Configuration
@Slf4j
public class ThreadPoolConfiguration {
@Bean(name = "defaultThreadPoolExecutor", destroyMethod = "shutdown")
public ThreadPoolExecutor systemCheckPoolExecutorService() {
return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(10000),
new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(),
(r, executor) -> log.error("system pool is full! "));
}
}
注意:@Async 注解标注的方法是异步执行,因此在外层直接获取方法返回结果是获取不到的,即外部线程得到的结果为 null。