什么是“异步调用”?

“异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
同步调用
下面通过一个简单示例来直观的理解什么是同步调用:
定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)
package com.kfit.task;
import java.util.Random;
import org.springframework.stereotype.Component;
/**
* 定义3个任务
* @author Angel(QQ:412887952)
* @version v.0.1
*/
@Component
publicclass Task1 {
//定义一个随机对象.
publicstatic Random random =new Random();
//任务一;
publicvoid doTaskOne() throws Exception {
System.out.println("开始做任务一");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");
}
//任务二;
publicvoid doTaskTwo() throws Exception {
System.out.println("开始做任务二");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");
}
//任务3;
publicvoid doTaskThree() throws Exception {
System.out.println("开始做任务三");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");
}
}
编写一个访问方法:
//测试task1.
@RequestMapping("/task1")
public String task1() throws Exception{
task1.doTaskOne();
task1.doTaskTwo();
task1.doTaskThree();
return"task1";
}
运行可以看到类似如下输出:
开始做任务一
完成任务一,耗时:4156毫秒
开始做任务二
完成任务二,耗时:557毫秒
开始做任务三
完成任务三,耗时:6171毫秒
异步调用
上述的同步调用虽然顺利的执行完了三个任务,但是可以看到执行时间比较长,若这三个任务本身之间不存在依赖关系,可以并发执行的话,同步调用在执行效率方面就比较差,可以考虑通过异步调用的方式来并发执行。
在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,Task类改在为如下模式:
package com.kfit.task;
import java.util.Random;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* 定义3个任务
* @author Angel(QQ:412887952)
* @version v.0.1
*/
@Component
publicclass Task2 {
//定义一个随机对象.
publicstatic Random random =new Random();
//任务一;
@Async
publicvoid doTaskOne() throws Exception {
System.out.println("开始做任务一");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");
}
//任务二;
@Async
publicvoid doTaskTwo() throws Exception {
System.out.println("开始做任务二");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");
}
//任务3;
@Async
publicvoid doTaskThree() throws Exception {
System.out.println("开始做任务三");
longstart = System.currentTimeMillis();
Thread.sleep(random.nextInt(10000));
longend = System.currentTimeMillis();
System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");
}
}
为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync,如下所示:
@SpringBootApplication
@EnableAsync
publicclass App {
//省略其它代码…
}
编写测试方法:
//测试task2.
@RequestMapping("/task2")
public String task2() throws Exception{
task2.doTaskOne();
task2.doTaskTwo();
task2.doTaskThree();
return"task2";
}
此时可以反复执行单元测试,您可能会遇到各种不同的结果,比如:
开始做任务一
开始做任务二
开始做任务三
完成任务三,耗时:57毫秒
完成任务二,耗时:3621毫秒
完成任务一,耗时:7419毫秒
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# boot
# 异步调用
# async
# async异步执行
# spring boot使用自定义配置的线程池执行Async异步任务
# spring boot异步(Async)任务调度实现方法
# SpringBoot实现定时任务和异步调用
# SpringBoot用@Async注解实现异步任务
# Springboot任务之异步任务的使用详解
# 详细讲解springboot如何实现异步任务
# SpringBoot详细讲解异步任务如何获取HttpServletRequest
# Spring Boot小型项目如何使用异步任务管理器实现不同业务间的解耦
# 完成任务
# 可以看到
# 的是
# 就能
# 主程序
# 执行时间
# 要在
# 不存在
# 只需要
# 所示
# 用在
# 这三个
# 较长
# 还需
# 就比
# 大家多多
# 单元测试
# 都必须
# author
# Component
相关文章:
如何在阿里云高效完成企业建站全流程?
香港服务器部署网站为何提示未备案?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何在Windows虚拟主机上快速搭建网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
家庭建站与云服务器建站,如何选择更优?
如何在建站宝盒中设置产品搜索功能?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何在建站之星网店版论坛获取技术支持?
建站之星北京办公室:智能建站系统与小程序生成方案解析
如何通过二级域名建站提升品牌影响力?
建站之星导航配置指南:自助建站与SEO优化全解析
如何在Windows服务器上快速搭建网站?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
盐城做公司网站,江苏电子版退休证办理流程?
已有域名和空间如何快速搭建网站?
如何快速重置建站主机并恢复默认配置?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何在建站主机中优化服务器配置?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
网站图片在线制作软件,怎么在图片上做链接?
如何在阿里云虚拟服务器快速搭建网站?
如何正确下载安装西数主机建站助手?
建站主机服务器选型指南与性能优化方案解析
如何快速生成高效建站系统源代码?
建站VPS选购需注意哪些关键参数?
小程序网站制作需要准备什么资料,如何制作小程序?
如何通过VPS建站实现广告与增值服务盈利?
外贸公司网站制作哪家好,maersk船公司官网?
建站主机如何选?性能与价格怎样平衡?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何通过服务器快速搭建网站?完整步骤解析
动图在线制作网站有哪些,滑动动图图集怎么做?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何在阿里云域名上完成建站全流程?
深圳网站制作的公司有哪些,dido官方网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
宝塔新建站点为何无法访问?如何排查?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
网站好制作吗知乎,网站开发好学吗?有什么技巧?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
黑客如何通过漏洞一步步攻陷网站服务器?
建站DNS解析失败?如何正确配置域名服务器?
家具网站制作软件,家具厂怎么跑业务?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
*请认真填写需求信息,我们会在24小时内与您取得联系。