开发者社区 > 博文 > 你真的了解@Async吗?
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

你真的了解@Async吗?

  • guochunchunyuan
  • 2023-11-08
  • IP归属:北京
  • 4200浏览

    使用场景:

       开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@Async。但是直接使用 @Async 会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的 SimpleAsyncTaskExecutor 线程池,会不断的创建线程,当并发大的时候会严重影响性能。所以可以将异步指定线程池使用

    简介:

       @Async是Spring的注解,可以加在类或方法上。通俗的来讲,如果加上了这个注解,那么该类或者该方法在使用时将会进行异步处理,也就是创建一个线程来实现这个类或者方法,实现多线程。

    线程池的执行顺序:

    两种使用方式:

      第一种:

       使用的是Spring默认的线程池SimpleAsyncTaskExecutor

       接入步骤:

           1.需要在@SpringBootApplication启动类或者@configure注解类上 添加注解@EnableAsync启动多线程注解。

           2.在需要异步执行的方法上添加@Async注解。

       默认的线程池配置:

    如果需要修改默认的配置可以在yaml或者properties中添加,修改默认配置:

    执行后会打印出你的执行线程名称:

    第二种:(推荐使用)

    自定义线程池,执行异步。

    自定义线程池有如下模式,我们只介绍最后一种:

    • 重新实现接口AsyncConfigurer;
    • 继承AsyncConfigurerSupport;
    • 配置由自定义的TaskExecutor替代内置的任务执行器。

    然后添加注解到对应的方法上并指定线程池:asyncExecutor

    :

    指定线程池的名称为自定义的线程池名称。

    查看日志:

    注意事项:

    查到了@Async失效的几个原因:

    * 1.注解@Async的方法不是public方法;

    * 2.注解@Async的返回值只能为void或Future;

    * 3.注解@Async方法使用static修饰也会失效;

    * 4.启动类没加@EnableAsync注解;

    * 5.调用方和@Async不能在一个类中;

    * 6.在Async方法上标注@Transactional是没用的,但在Async方法调用的方法上标注@Transcational是有效的;