SpringBoot 异步注解 @Async


除了硬编码的异步编程处理方式, 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! "));
    &#125;
&#125;

注意:@Async 注解标注的方法是异步执行,因此在外层直接获取方法返回结果是获取不到的,即外部线程得到的结果为 null。

注解原理机制

参考文档:https://cloud.tencent.com/developer/article/1426027


文章作者: shone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 shone !
评论
 上一篇
SpringBoot 中配置线程池 SpringBoot 中配置线程池
线程池配置 Java线程池实现原理及其在美团业务中的实践:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html SpringBoot 线程池 配置使
2023-02-02
下一篇 
Spring ApplicationEvent 事件 Spring ApplicationEvent 事件
事件机制在一些大型项目中被经常使用,Spring 专门提供了一套事件机制的接口,满足了架构原则上的解耦。 ApplicationContext 通过 ApplicationEvent 类和 ApplicationListener 接口进行事
2023-02-02
  目录