Spring Boot7--使用@Async实现异步调用

Spring Boot 合理使用 @Async 注解开启异步 Spring Boot 使用 @Async 注解 阅读详情

“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。

先测试一下同步调用:

书写同步调用测试用例:

运行后输出:

开始做任务一
完成任务一,耗时:9723毫秒
开始做任务二
完成任务二,耗时:3498毫秒
开始做任务三
完成任务三,耗时:7015毫秒

上述的同步调用虽然顺利的执行完了三个任务,但是可以看到执行时间比较长,
若这三个任务本身之间不存在依赖关系,可以并发执行的话,同步调用在执行效率方面就比较差,
可以考虑通过异步调用的方式来并发执行。

Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数。

注:为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync,
* @Async所修饰的函数不要定义为static类型,这样异步调用不会生效

此时可以反复执行单元测试,您可能会遇到各种不同的结果,比如:

  • 没有任何任务相关的输出
  • 有部分任务相关的输出
  • 乱序的任务相关的输出

原因是目前doTaskOne、doTaskTwo、doTaskThree三个函数的时候已经是异步执行了。主程序在异步调用之后,主程序并不会理会这三个函数是否执行完成了,由于没有其他需要执行的内容,所以程序就自动结束了,导致了不完整或是没有输出任务相关内容的情况。

异步回调

为了让doTaskOne、doTaskTwo、doTaskThree能正常结束,假设我们需要统计一下三个任务并发执行共耗时多少,这就需要等到上述三个函数都完成调动之后记录时间,并计算结果。

测试用例的书写

  • 在测试用例一开始记录开始时间
  • 在调用三个异步函数的时候,返回Future<String>类型的结果对象
  • 在调用完三个异步函数之后,开启一个循环,根据返回的Future<String>对象来判断三个异步函数是否都结束了。若都结束,就结束循环;若没有都结束,就等1秒后再判断。
  • 跳出循环之后,根据结束时间 - 开始时间,计算出三个任务并发执行的总耗时。

执行一下上述的单元测试,可以看到如下结果:

 

可以看到,通过异步调用,让任务一、二、三并发执行,有效的减少了程序的总运行时间。

------参考出自程序猿DD

spring boot 学习(十一)使用@Async实现异步调用 springboot使用@Async实现异步调用 “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行;”异步调用”则是只要上一行代码执行,无需等待结果的返回就开始执行本身任务。 阅读详情

相关推荐

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3672

@async会影响threadlocal传值么?

然而,在某些情况下,异步代码可能会涉及到线程切换或线程池的使用,这可能导致线程局部变量的上下文切换。如果你在异步代码中使用线程局部变量,并且在切换线程的过程中需要访问该变量,那么你可能需要小心处理线程局部变量的传值问题。装饰器本身并不会直接影响线程局部变量的传值,但在某些情况下,异步代码中的线程切换可能会导致一些注意事项。线程局部变量(ThreadLocal)是一种线程级别的数据存储机制,允许在一个线程中存储和访问特定于该线程的数据。线程局部变量只对同一线程内的代码块可见,无论代码块是同步的还是异步的。

xiaomao329的博客 516

Geoserver新手必看:5分钟搞定世界地图发布(附中国省市数据)

本文为Geoserver新手提供了快速发布世界地图的实战指南。从环境搭建、数据准备入手,详细讲解了如何创建工作区、添加数据存储、发布图层及配置关键参数,并最终通过创建图层组实现地图服务的整合与预览。文章旨在帮助用户快速掌握Geoserver发布地图服务的核心流程与实用技巧。

cola5的博客 223

字节架构师:来说说Java异步调用的几种方式你都搞懂了吗?

字节架构师:来说说Java异步调用的几种方式你都搞懂了吗?一、通过创建新线程二、通过线程池三、通过@Async注解四、通过CompletableFuture 日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结果就对原服务进行返回。这里就涉及的Java异步调用的一个知识。下面本文尝试将Java异步调用的多种方式进行归纳。 一、通过创建新线程 首先的我们得认识到,**异步调用的本质,其实是通过开启一个新的线程来执行。**如以下例子: public static.

Delilah_java的博客 2082

HFSS实战(三)——过孔via TDR仿真

在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看到一个整体的结果,并不知道via真实的阻抗是多少?想要单独确定via的阻抗,最好还是通过TDR的仿真。

luohuo9844的博客 1万+

UE4 Instanced Mesh 半透明渲染顺序不对解决

以绿色方块为Instanced Mesh为例。 正确的半透应该是这样的: 这是一般蓝图Actor方块,其半透是正常的。 然而Instanced Mesh因为过多,UE4不给你缓存正确的渲染顺序。所以,在不改代码的情况下,想解决Instanced Mesh半透问题,是不可能的。不正确的半透如下: 注意到错误发生在Instanced Mesh的方块与方块之间。 但我就是要解决,...

qq_41524721的博客 5569

Spring中使用@Async异步调用方法

Async简介: 异步方法调用使用场景:处理日志、发送邮件、短信...... spring中提供了@Async来实现异步方法。 @Async修饰类,则该类所有方法都是异步的,@Async修饰方法,则该方法是异步的。 被修饰的方法在被调用时,会在一个新的线程中执行。 Spring中通过在方法上设置@Async注解,可使得方法被异步调用。也就是该方法会在调用时立即返回,而这个方法的实际执行交...

静风落叶的博客 4752

42、Windows Server Update Services(WSUS)全面指南

本文全面介绍了Windows Server Update Services(WSUS)的安装、配置、管理与优化策略。内容涵盖WSUS基础认知、客户端更新问题解决、多服务器架构设计、计算机分组策略、更新审批与报告查看,并深入探讨了SSL加密配置、性能优化、与其他系统(如AD和SCCM)集成以及常见故障排查方法。通过本指南,IT管理员可高效部署和管理企业级软件更新,提升安全性和运维效率。

cicd6pipeline的博客 98

java中的异步调用_如何在Java中异步调用方法

我一直在看着Go’s goroutines最近,认为在Java有类似的东西会很好。就我已经搜索的常见方法并行化方法调用是做类似的:final String x = "somethingelse";new Thread(new Runnable() {public void run() {x.matches("something");}}).start();这不是很优雅。有没有更好的方法这样做?我需...

weixin_33245968的博客 2287

[Dify 案例实战] 构建一个基于 Dify 的个人写作助理工具-带绑定资源

想要一个懂你风格、能帮你写文章、润色文字、生成大纲的 AI 写作助手? 本文将带你从 0 到 1,完整实现一个 基于 Dify 工作流的个人写作助理工具。 我们会利用 Dify 的 LLM 节点、变量传递、文本处理、知识库与多轮对话能力.

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 274

SAP-ABAP:SAP创建CDS视图(SQL语句创建)实例详解

通过Eclipse和ADT创建CDS视图是SAP开发中的一项重要技能。CDS视图不仅简化了数据建模,还提供了高性能和灵活性。掌握CDS视图的开发和使用,可以帮助你更好地支持SAP S/4HANA和Fiori应用的开发。

baidu_35680696的博客 1823

Java实现异步调用

Java实现异步调用 一、创建线程 @Test public void test0() throws Exception { System.out.println("main函数开始执行"); Thread thread=new Thread(new Runnable() { @Override public void run() { System.out.println("===task start==="); try { Thread.s

你还有好多未完成的梦,你有什么理由停下? 502

TMS320F28335调试跟踪的问题:DSP从上电复位,一直到执行main()的第一条语句之间,都干了些什么,以及CCS调试时程序查找的问题

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1210

【SpringBoot】SpringBoot 中使用 @Async 实现优雅地异步调用

在 Java 中,当我们需要执行异步操作时,往往会去创建一个新线程去执行,如下: ```java public class App { public static void main( String[] args ) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + ":异步任务"); }).start(); } } ``` Spring

sco5282的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

spring boot 使用注解@async实现异步调用

什么是“异步调用”?        “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用 下面通过一个简单示例来直观的理解什么是同步调用:        定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机

ForeverLove的博客 4193

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【@Async】一文带你深入学习Spring注解之@Async使用

Spring Boot的@Async注解提供了简单且强大的方式来实现异步处理。通过启用异步支持、定义异步方法并自定义TaskExecutor,可以高效地处理各种异步任务。掌握@Async注解的使用和原理,有助于提升应用程序的性能和响应速度。但是其局限性也是非常明显的,因此,要想用好该@Async注解,还是需要在此基础上加以扩展。我是Wasteland,下期文章再见!

weixin_51360020的博客 6917

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Spring Boot】@Async 注解的使用

案例需求:用户下单后,服务端生成订单并保存,然后给用户发短信、邮件通知下单成功 由于短信和邮件发送比较耗时,是秒级别的,所以应采用异步的方式,实现方案有很多,这里使用Spring提供的对ThreadPoolExecutor封装的线程池ThreadPoolTaskExecutor,直接在业务方法上使用注解@Async即可(先用@EnableAsync开启)

Hi there 3939

Spring Boot:使用 @Async 注解时要避免的7个错误

其中,我个人认为大多数人会陷入的问题集中在未配置自定义线程池、在同一个类中调用异步方法以及事务不起作用等问题上。所以,最合适的写法还是专门定义一个 AsyncService 类,将所有异步方法写在里面,当需要使用时,只需在其他类中注入即可。

qq_28791753的博客 2178

初识spring-boot异步编程@async

开始 首先 spring的官网给出了详细的教程,但是对于比较爱国的大家(以及我)可能看的模模糊糊 官网:spring-async异步编程。优秀的异步编程能使我们系统的响应速度加快用户体验更好比如某宝网的查看商品详情会出现销量数库存数量评价数量… — 开始之前你得已经熟悉了spring-boot开发的流程。 第一步:新建一个配置类 @EnableAsync // 启用 @Async @Configuration public class ExecutorConfig { @Bean publi

zhouhouxing 2280

Spring Boot系列之@Async异步调用

写在前面的话 哈喽,好久不见,你们还好吗? 今天给大家带来的是我在实际项目上遇到的一个问题。 流程大致是,调用接口,然后将接口返回的数据更新一份到本地数据库,然后返回给前端。更新到本地数据库这个操作原本是用的异步。 国庆回老家,公司打电话来,前端转几秒的圈圈,然后无数据。经查,是Redis出了问题,用不了。 什么意思? 从接口请求到的数据,更新到本地数据库,这里有一个策略,先将数据放到Redis中,然后进行对比,如果不一致,再更新。Redis不可用,那么都查询数据库,就会很慢,前端请求接口一般是5s超时。

冯文议技术博客 578

SpringBoot使用@Async异步调用

转载自:https://blog.youkuaiyun.com/weixin_39528789/article/details/80769112 什么是“异步调用”? “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用 下面通过一个简单示例来...

lizhengyu891231的博客 264

Spring Boot 异步请求和异步调用,一文搞定!

“异步调用”对应的是“同步调用”, 在实际开发中,有时候为了及时处理请求和进行响应,我们可能使用异步调用,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。异步调用的实现有很多,例如多线程、定时任务、消息队列等。 这里学习使用@Async注解来实现异步调用。 1、@EnableAsync 首先,我们需要在启动类上添加 @EnableAsync 注解来声明开启异步方法。 @Spr..

LeZiJie的博客 700

spring boot @Async 的异步调用,涉及CountDownLatch堵塞和Future的超时处理

转载于:https://www.jianshu.com/p/712c60c43456 最近项目的一个业务场景需要使用异步 , 码代码到断断续续完善代码 . 查询了挺多的资料文档, 现在记录一下. 一 : 业务场景 类似QQ 中的设置页面 , 左侧每个选项对应右侧的具体设置 , 项目中暂且简化为需要插入7条数据到不同数据表, 第一条数据和最后一条数据是为了提醒用户开始和结束 ...

yanwu77的专栏 2056

springboot 异步mysql_spring boot 使用@Async实现异步调用方法

使用@Async实现异步调用什么是”异步调用”与”同步调用”“同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行;”异步调用”则是只要上一行代码执行,无需等待结果的返回就开始执行本身任务。通常情况下,”同步调用”执行程序所花费的时间比较多,执行效率比较差。所以,在代码本身不存在依赖关系的话,我们可以考虑通过”异步调用”的方式来并发执行。“异步调用”在 spr...

weixin_39980184的博客 256

Spring Boot中使用@Async实现异步调用

什么是“异步调用”? “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)   ...

零度的博客专栏 890

springboot 异步 @Async 的日常使用及失效场景

从上面的 @Async 使用我们看到,添加注解的异步方法在一个单独的类 AsyncService 中,然后注入到 AsyncTestService 中进行调用。在 Springboot 中要开启@Async注解异步的功能,需要在项目的启动类,或者配置类上,使用@EnableAsync注解。使用@Async注解声明的方法,必须是能被重写的,很显然static修饰的方法,是类的静态方法,是不允许被重写的。@EnableAsync注解相当于一个开关,控制是否开启@Async注解异步的功能,默认是关闭的。

m0_58680865的博客 1581
上一篇: Spring Boot6--统一异常处理
下一篇: Spring Boot8--log4j日志记录
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值