你真的了解@Async吗?

使用场景:

开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@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是有效的;

作者:京东零售 郭春元

来源:京东云开发者社区 转载请注明来源

相关推荐
Bug退退退1238 小时前
RabbitMQ 高级特性之事务
java·分布式·spring·rabbitmq
程序员秘密基地8 小时前
基于html,css,vue,vscode,idea,,java,springboot,mysql数据库,在线旅游,景点管理系统
java·spring boot·mysql·spring·web3
小码氓8 小时前
Java填充Word模板
java·开发语言·spring·word
Muxiyale8 小时前
使用spring发送邮件,部署ECS服务器
java·服务器·spring
合作小小程序员小小店12 小时前
web网页,在线%食谱推荐系统%分析系统demo,基于vscode,uniapp,vue,java,jdk,springboot,mysql数据库
vue.js·spring boot·vscode·spring·uni-app
zzywxc78715 小时前
AI技术通过提示词工程(Prompt Engineering)正在深度重塑职场生态和行业格局,这种变革不仅体现在效率提升,更在重构人机协作模式。
java·大数据·开发语言·人工智能·spring·重构·prompt
JouJz18 小时前
Spring事务管理深度解析:原理、实践与陷阱
java·spring
麦兜*20 小时前
Spring Boot秒级冷启动方案:阿里云FC落地实战(含成本对比)
java·spring boot·后端·spring·spring cloud·系统架构·maven
fouryears_2341721 小时前
深入拆解Spring核心思想之一:IoC
java·后端·spring
快乐非自愿1 天前
商品中心—库存分桶高并发的优化文档
java·前端·spring