Spring boot如何实现异步调用

异步调用:一个可以无需等待被调用函数的返回值就让操作继续进行的方法

举个例子

异步调用就是你 喊 你朋友吃饭 ,你朋友说知道了 ,待会忙完去找你 ,你就去做别的了。同步调用就是你 喊 你朋友吃饭 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你们一起去。

我想大家都了解了,但是怎么在代码中实现,我们以往的代码都是一步步执行下去的,现在我们要求某个耗时方法,让他单独执行不考虑结果。

题目

@SpringBootTestclass GzhApplicationTests {

    @Autowired    private AsyncTest asyncTest;

    @Test    void contextLoads() throws Exception {        System.out.println("---执行主线---");        asyncTest.test1();        System.out.println("---主线结束---");    }}
@Componentpublic class AsyncTest {

    public void test1() {        System.out.println("---执行副本---");        for (int i = 0; i 5; i++) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("---副本ing---");        }        System.out.println("---副本结束---");    }}

运行结果

---执行主线------执行副本------副本ing------副本ing------副本ing------副本ing------副本ing------副本结束------主线结束---

这边的结果看到了,他是先执行完副本,然后主线才结束,我们想要的是不管副本如何我们都要继续往下走,专业术语异步执行

有同学说简单,new Thread(),把副本放进去就可以了。

@Testvoid contextLoads() throws Exception {    System.out.println("---执行主线---");    new Thread(()-> asyncTest.test1()).start();    System.out.println("---主线结束---");}//---执行主线---//---主线结束---//---执行副本---

有人会问副本为什么没有执行完,你用的是单元测试,主程序跑完就项目就停止了,你要是不用单元测试的话,他会执行完。

当然用new Thread()可以解决,但是今天要用注解方式解决。@Async这个注解就可以解决。

@EnableAsync@SpringBootApplicationpublic class GzhApplication {

    public static void main(String[] args) {        SpringApplication.run(GzhApplication.class, args);    }

}
@Componentpublic class AsyncTest {

    @Async    public void test1() {        System.out.println("---执行副本---");        for (int i = 0; i 5; i++) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("---副本ing---");        }        System.out.println("---副本结束---");    }}
@SpringBootTestclass GzhApplicationTests {

    @Autowired    private AsyncTest asyncTest;

    @Test    void contextLoads() throws Exception {        System.out.println("---执行主线---");        asyncTest.test1();        System.out.println("---主线结束---");    }}
---执行主线------主线结束------执行副本---

但是有同学会说不我添加了注解不行啊。这地方我们就要去来说说要注意的事项。

失效原因

  • 1.没有在@SpringBootApplication启动类当中添加注解@EnableAsync注解。
  • 2.异步方法使用注解@Async的返回值只能为void或者Future。
  • 3.没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。

第一个和第二个的意思很清楚,第三个的意思就是类的内部调用是无效的。方法一定要从另一个类中调用,也就是从类的外部调用。如果你想内部调用就获取其代理对象。


调用别的方法的返回值_Spring boot如何实现异步调用相关推荐

  1. Android WebView 调用JS方法获取返回值

    一.Android4.4+ 如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值 webview ...

  2. 阶段1 语言基础+高级_1-2 -面向对象和封装_11使用对象类型作为方法的返回值

    自定义的类做为方法的返回值.新建类Dmeo05 谁调用我,我就把one的地址返回给谁 内存中发生了什么 程序要想运行main方法先进栈 进来以后定义了一个phone two.two和刚才有什么不一样? ...

  3. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

    Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...

  4. c++ 调用python2类获取返回值

    vs2017好像没有 PyObject* PyIns = PyInstance_New(pyCls, NULL, NULL); // 创建tester类 前面介绍了用python调用C++时用swig ...

  5. setTimeout() 方法的返回值

    setTimeout() 方法的返回值 setTimeout() 方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTim ...

  6. 函数式接口作为方法的返回值类型案例

    类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式.当需要通过一 个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调 ...

  7. Java基础知识之方法的返回值与重载

    文章目录 一.方法的返回值 二.方法的重载 一.方法的返回值 1.说明 就是方法调用结束的标志,会返回一个值给调用该方法的方法里,然后我们常用的就是使用一个变量去接收这个值,并把这个值用作其他的操作. ...

  8. mybatis mysql 调用存储过程 多个返回值_被Mybatis坑惨了

    关注米兜Java并置顶,一起涨姿势- 关注米兜 Spring 2020     热点推荐 1 抛去try {...} catch {...} finally {...},让代码更轻便 2 无所不能的J ...

  9. Spring MVC使用篇(八)—— 处理器(Handler)方法的返回值

    文章目录 1.演示项目环境搭建 1.1 演示项目工程结构 1.2 演示项目依赖的基础jar包 1.3 配置web.xml 1.4 配置Spring MVC核心配置文件 2.返回ModelAndView ...

最新文章

  1. 如何创建一个用户、授权操作k8s集群的过程?
  2. wxpython应用程序对象与顶级窗口_wxPython--学习笔记
  3. LeetCode-461. 汉明距离(python3)
  4. 搜集到的数学分析例题(不断更新)
  5. apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)
  6. 人工智能学习书单推荐
  7. JSP中鼠标禁用代码
  8. 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)
  9. vue 点击文字input_vue input实现点击按钮文字增删功能示例
  10. python爬虫教程-Python爬虫五大零基础入门教程
  11. Java基础:基础加强巩固
  12. android 点击文本框 不调用键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...
  13. plsqldev1105_x64与instantclient_11_2配置使用
  14. python中的写入文件
  15. 百度翻译API教程(完整Android代码)
  16. js实现房贷月供计算还款状况(贷款计算功能)
  17. final 和effectively final区别
  18. 50部必看的经典好莱坞电影
  19. JDK 17:Java 17 中的新特性
  20. 3D打印切片软件Cura入门

热门文章

  1. 开发过程中编写的一些批处理
  2. POJ-2400 Supervisor, Supervisee 带权值匹配+枚举所有匹配情况
  3. 关于调用Oracle存储过程时发生“BCD Overflow”错误的处理
  4. Unity3D-InstantOC遮挡剔除
  5. linux服务器运维操作命令,Windows和Linux系统服务器运维基本操作指令
  6. 单片机与微型计算机在结构上的区别和联系,AT89S52单片机片内硬件组成结构,与一般单片机和微机组成结构比较,显著区别有?...
  7. python编程入门单例_python实现单例模式怎么写啊?
  8. tf.cast()类型转换函数
  9. PyTorch框架学习九——网络模型的构建
  10. 《画解算法》1.两数之和【python实现】