@Async异步调用的使用及原理

同步和异步:

  • 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
  • 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

使用

@Async的使用网上例子很多

如:https://blog.csdn.net/v2sking/article/details/72795742

https://blog.csdn.net/qq_22076345/article/details/82194482

 

原理

类比@Transactional,@Async也是生成一个代理类去进行执行异步方法。

 spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@Async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用。
 

    那在深入一步,spring为我们提供了AOP,面向切面的功能。他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了!

问题

当我们没有自定义线程池的时候,spring会开启默认线程池吗?大小为多少?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Async方法是Spring框架中的一种特殊注解,用于实现异步方法调用。通过在方法上添加@Async注解,可以告诉Spring容器该方法应该在单独的线程中执行,而不阻塞当前线程的执行。\[1\] 要使用@Async方法调用,需要按照以下步骤进行操作: 1. 在启动类上添加@EnableAsync注解,以启用异步功能。\[2\] 2. 在需要异步执行的方法上添加@Async注解。这样,当调用该方法时,Spring自动将其放入线程池中执行,并返回一个Future对象,用于获取异步方法的执行结果。\[3\] 例如,假设我们有一个名为doSomething的方法需要异步执行,我们可以在方法上添加@Async注解,如下所示: ```java @Async public Future<String> doSomething() { // 异步执行的逻辑 return new AsyncResult<>("异步方法执行结果"); } ``` 在调用doSomething方法时,它将在单独的线程中执行,并返回一个Future对象。我们可以使用该对象来获取异步方法的执行结果,如下所示: ```java Future<String> futureResult = doSomething(); String result = futureResult.get(); // 获取异步方法的执行结果 ``` 通过使用@Async方法调用,我们可以实现并发执行任务,提高系统的响应性能和吞吐量。同时,它也可以帮助我们处理那些不需要立即返回结果的耗时操作,提高系统的并发处理能力。 #### 引用[.reference_title] - *1* *3* [在Spring中使用Future对象调用Async方法调用](https://blog.csdn.net/dnc8371/article/details/106705454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spring中使用@Async异步调用方法](https://blog.csdn.net/qq_34178998/article/details/95939425)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值