调用别的方法的返回值_Spring boot如何实现异步调用
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如何实现异步调用相关推荐
- Android WebView 调用JS方法获取返回值
一.Android4.4+ 如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值 webview ...
- 阶段1 语言基础+高级_1-2 -面向对象和封装_11使用对象类型作为方法的返回值
自定义的类做为方法的返回值.新建类Dmeo05 谁调用我,我就把one的地址返回给谁 内存中发生了什么 程序要想运行main方法先进栈 进来以后定义了一个phone two.two和刚才有什么不一样? ...
- controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...
Spring中涉及的设计模式总结,在面试中也会经常问道 Spring 中设计模式的问题.本文以实现方式.实质.实现原理的结构简单介绍 Sping 中应用的 9 种设计模型,具体详细的刨析会在后面的文章 ...
- c++ 调用python2类获取返回值
vs2017好像没有 PyObject* PyIns = PyInstance_New(pyCls, NULL, NULL); // 创建tester类 前面介绍了用python调用C++时用swig ...
- setTimeout() 方法的返回值
setTimeout() 方法的返回值 setTimeout() 方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTim ...
- 函数式接口作为方法的返回值类型案例
类似地,如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式.当需要通过一 个方法来获取一个java.util.Comparator 接口类型的对象作为排序器时,就可以调 ...
- Java基础知识之方法的返回值与重载
文章目录 一.方法的返回值 二.方法的重载 一.方法的返回值 1.说明 就是方法调用结束的标志,会返回一个值给调用该方法的方法里,然后我们常用的就是使用一个变量去接收这个值,并把这个值用作其他的操作. ...
- mybatis mysql 调用存储过程 多个返回值_被Mybatis坑惨了
关注米兜Java并置顶,一起涨姿势- 关注米兜 Spring 2020 热点推荐 1 抛去try {...} catch {...} finally {...},让代码更轻便 2 无所不能的J ...
- Spring MVC使用篇(八)—— 处理器(Handler)方法的返回值
文章目录 1.演示项目环境搭建 1.1 演示项目工程结构 1.2 演示项目依赖的基础jar包 1.3 配置web.xml 1.4 配置Spring MVC核心配置文件 2.返回ModelAndView ...
最新文章
- 如何创建一个用户、授权操作k8s集群的过程?
- wxpython应用程序对象与顶级窗口_wxPython--学习笔记
- LeetCode-461. 汉明距离(python3)
- 搜集到的数学分析例题(不断更新)
- apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)
- 人工智能学习书单推荐
- JSP中鼠标禁用代码
- 人工智能重点汇总(搜索策略、博弈、贝叶斯、SVM、神经网络、弧相容、SVM、决策树、反向传播、卷积神经网络)
- vue 点击文字input_vue input实现点击按钮文字增删功能示例
- python爬虫教程-Python爬虫五大零基础入门教程
- Java基础:基础加强巩固
- android 点击文本框 不调用键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...
- plsqldev1105_x64与instantclient_11_2配置使用
- python中的写入文件
- 百度翻译API教程(完整Android代码)
- js实现房贷月供计算还款状况(贷款计算功能)
- final 和effectively final区别
- 50部必看的经典好莱坞电影
- JDK 17:Java 17 中的新特性
- 3D打印切片软件Cura入门
热门文章
- 开发过程中编写的一些批处理
- POJ-2400 Supervisor, Supervisee 带权值匹配+枚举所有匹配情况
- 关于调用Oracle存储过程时发生“BCD Overflow”错误的处理
- Unity3D-InstantOC遮挡剔除
- linux服务器运维操作命令,Windows和Linux系统服务器运维基本操作指令
- 单片机与微型计算机在结构上的区别和联系,AT89S52单片机片内硬件组成结构,与一般单片机和微机组成结构比较,显著区别有?...
- python编程入门单例_python实现单例模式怎么写啊?
- tf.cast()类型转换函数
- PyTorch框架学习九——网络模型的构建
- 《画解算法》1.两数之和【python实现】