springboot:嵌套使用异步注解@Async还会异步执行吗
一、引言
在前边的文章《[springboot:使用异步注解@Async的那些坑》中介绍了使用@Async注解获取任务执行结果的错误用法,今天来分享下另外一种常见的错误。
二、代码演示
下面是我的controller的代码,
package com.atssg.controller;
import com.atssg.service.MyAsyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequestMapping("/sync/")
@RestController
public class SyncController2 {
@Autowired
private MyAsyncService syncService;
@GetMapping("/test2")
public String test2() {
return syncService.syncMethod("hello world");
}
}
在controller中调用了service层的syncMethod方法,下面看该方法的定义,
package com.atssg.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Slf4j
@Service
public class MyAsyncService {
@Autowired
private SyncService syncService;
public String syncMethod(String str) {
String result = null;
try {
log.info("start,{}",System.currentTimeMillis());
//调用method4方法,该方法中会桥套调用另外一个异步方法
Future<String> futureResult = syncService.method4(str);
result = futureResult.get();
log.info("end:{}",System.currentTimeMillis());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return result;
}
}
method4方法是一个异步的方法,在该方法内部会调用另外一个异步的方法,下面看该method4方法的定义,
/**
* 调用另一个异步方法
*
* @param str
* @return
* @throws InterruptedException
*/
public Future<String> method4(String str) throws InterruptedException {
//method4方法睡眠10s
Thread.sleep(1000 * 10);
//调用另外一个异步方法
method1(str);
return new AsyncResult<>(str);
}
下面看method1方法,
public Future<String> method1(String str) throws InterruptedException {
Thread.sleep(1000 * 10);
return new AsyncResult<>(str);
}
该方法也是睡眠10s。另外这两个方法均是异步方法,有小伙伴会疑惑,怎么没有标注异步注解@Async那,这是因为该注解可以用在方法上也可以用在类上,在前面的文章中说过,不知道小伙伴还记得吗,不清楚的可以再看下给注解的定义哦。下面是我的类,大体看下,
小伙伴们看到了吗,我是在类上标注了@Async的哦,这样对于该类中所有的方法都是起作用的,即所有方法都是异步的。
按照正常的逻辑来分析,method4和method1都是异步方法,且两个方法均睡眠10s,那么异步执行的结果应该是10s多点,但这里是在method4中调用了method1,即嵌套调用,那么结果会是什么样子那。看下执行结果,
看到这个执行结果小伙伴是不是很惊讶,执行时间大约是20s多点,不相信的小伙伴可以多执行几次,结果发现都是20s多点,这是为什么,不应该是10s多点,难道异步执行失效了吗
三、总结
在异步方法中调用另外一个异步方法会导致异步执行失败,就是上面的执行结果,所以不要在异步方法中再调用异步方法,达到异步执行的目的。有小伙伴会问这是为什么那,事先透露下这个要从异步的原理说起,异步的原理是通过代理实现的,更多内容欢迎关注下集更精彩。
推荐阅读
springboot:使用异步注解@Async获取执行结果的坑
springboot:异步调用@Async

springboot:嵌套使用异步注解@Async还会异步执行吗的更多相关文章
- springboot:使用异步注解@Async的前世今生
在前边的文章中,和小伙伴一起认识了异步执行的好处,以及如何进行异步开发,对,就是使用@Async注解,在使用异步注解@Async的过程中也存在一些坑,不过通过正确的打开方式也可以很好的避免,今天想和大 ...
- springboot:使用异步注解@Async的那些坑
springboot:使用异步注解@Async的那些坑 一.引言 在java后端开发中经常会碰到处理多个任务的情况,比如一个方法中要调用多个请求,然后把多个请求的结果合并后统一返回,一般情况下调用其他 ...
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
前言 其实最近都在研究事务相关的内容,之所以写这么一篇文章是因为前面写了一篇关于循环依赖的文章: <面试必杀技,讲一讲Spring中的循环依赖> 然后,很多同学碰到了下面这个问题,添加了S ...
- 关于Dubbo和Spring异步注解@Async的冲突
项目中难免会有异步处理的需求,像异步记录日志啦,异步发送邮件啦,而Dubbo又是现在主流的分布式框架,所有异步+Dubbo的组合是再所难免的 但博主是实践中发现Dubbo的服务并不能很好的跟Sprin ...
- Java中异步注解@Async的陷阱
或许,你在Java后端添加异步过程时会这样处理,然后摇摇大摆.灰溜溜地闪,而实际的运行结果却并不是我们期望的那样.那么,现在就将试验结果记录如下,以便少走弯路. (一)在Controller层的公开接 ...
- @Async异步注解与SpringBoot结合使用
当你在service层需要启动异步线程去执行某些分支任务,又不希望显式使用Thread等线程相关类,只想专注于实现业务逻辑代码开发,可以使用@Async异步注解. 1. 使用@Async 异步注解 C ...
- SpringBoot系列——@Async优雅的异步调用
前言 众所周知,java的代码是同步顺序执行,当我们需要执行异步操作时我们需要创建一个新线程去执行,以往我们是这样操作的: /** * 任务类 */ class Task implements Run ...
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- springboot:异步调用@Async
在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...
随机推荐
- 【LeetCode】59.螺旋矩阵II
59.螺旋矩阵II 知识点:数组: 题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 输入:n = 3 ...
- 1java基础
1.java特性 详细解读 Java语言_小沐CA-CSDN博客 (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为4 ...
- POJ3048
素数筛,数据范围不大,直接暴力筛. 坑:有个数据是 1 1,答案是1.差点没把我卡去世. 我的三观哪去了. #include<iostream> #include<cstdio> ...
- Lniux上的tomcat部署web项目路径问题
一.项目路径及部署.启动位置 1.在tomcat下部署应用,部署路径:一般直接部署在tomcat/webapps/ROOT下即可.2.默认访问路径:tomcat的默认访问路径为webapps/ROOT ...
- python中浮点数比较判断!为什么不能用==
问题:浮点数比较为什么不能用==来写? 答:计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存了一个最靠近的数字. 计算机表示浮点数(float或double类型)都有一 ...
- 算法优化---素数(质数)(Java版)
4.1优化算法-----输出素数 最简代码请直接移步文末 原代码:https://www.cnblogs.com/Tianhaoblog/p/15077840.html 对应优化如下 优化一:在遍历内 ...
- 大数据学习(11)—— Hive元数据服务模式搭建
这一篇介绍Hive的安装及操作.版本是Hive3.1.2. 调整部署节点 在Hadoop篇里,我用了5台虚拟机来搭建集群,但是我的电脑只有8G内存,虚拟机启动之后卡到没法操作,把自己坑惨了. Hive ...
- helm离线安装helm-push插件
helm-push版本:helm-push_0.9.0_linux_amd64 helm-push安装包 百度云: 链接: helm-push_0.9.0_linux_amd64 提取码: 26b ...
- Sth about Educational DP Contest
Contest Website : atcoder.jp/contests/dp \[\begin{array}{c|C|c|c} TaskNum & TaskName & Statu ...
- MySQL-初见
目录 初识MySQL 数据库基本命令 创建数据库表 数据库引擎 修改和删除表字段 MySQL数据管理 DML语言 DQL查询数据 单表查询 WHERE条件子句 模糊查询:比较操作符 联表查询 排序查询 ...