写点什么

你真的了解 @Async 吗? | 京东云技术团队

  • 2023-11-17
    北京
  • 本文字数:753 字

    阅读完需:约 2 分钟

你真的了解@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 是有效的;


作者:京东零售 郭春元

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

发布于: 刚刚阅读数: 5
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
你真的了解@Async吗? | 京东云技术团队_spring_京东科技开发者_InfoQ写作社区