异步调用|学习笔记

简介: 快速学习异步调用

开发者学堂课程【SpringBoot 实战教程异步调用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/651/detail/10793


异步调用


内容介绍:

一、定义

二、演示

 

一、定义

在项目中,难免会调用第三方接口当访问其它接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,可以使用多线程来并行的处理任务,SpringBoot 提供了异步处理方式@Async。


二、演示

1、写一个功能功能定义在 Service 创建一个 Service 的包写一个接口命名为 asyncService。可以多写几个功能效果明显

@Service  创建实例

public class AsyncServiceImpl implements AsyncService {

public static Random random =new Random() ; 睡的时间随机生成

@Async 让它单独开始子线程只需要加上这个注解即可异步执行

@Override

public Future<string> doTask1() throws ;Exception {

System. out. println ("任务一开始执行");  打印表示开始执行

long start = System. currentTimeMillis() ;  记录开始时间

Thread. sleep ( random. nextInt (10000)) ;  为了体现它的耗时让它单独开启的线程睡眠

long end = System. currentTimeMillis() ;记录结束时间

System. out. println("任务一结束耗时: " + (end - start) + "毫秒") ;

return new AsyncResult<> ("任务完成") ;用它的子类它是future具体的子类另外两个功能也是一样

@Async

@Override

public Future<String> doTask2 () throws Exception {

System. out.println ("(任务二开始执行") ;

Longstart=System. currentTimeMillis() ;

Thread. sleep( random. nextInt (10000) ) ;

Longend = System. currentTimeMillis() ;

System. out.println("任务二结束耗时"+ (end-start) +"毫秒") ;

return new AsyncResult<> ("任务二结束") ;

}

@Async

@Override

public Future<String> doTask3() throws Exception {

System.out .println ("任务三开始执行") ;

long start=System. currentTimeMillis() ;

Thread. sleep ( random. nextInt (10000) ) ;

Longend = System. currentTimeMillis () ;

System. out .println ("任务三结束耗时: "+ (end-start) +"毫秒") ;

Returnnew AsyncResult<> ("(任务三结束") ;

}

}

2、在 controller 中调用这三个功能要调用 service 功能所以把 service 进行注入统计三个功能全部执行完耗时多长先记录开始时间调用三个功能时它们会各自开启一个线程这时会有三个相应的子线程加上当前的主线程需要反复判断三个功能什么时候耗时完

@Controller

public class TestController {

@Autowired

private AsyncService asyncService ;

@RequestMapping ("/ show")

@ResponseBody

PublicString show ( )

{

/ /inta = 5/0;

int[]arr=newint[3] ;

System. out.println(arr[3]) ;

Return"show" ;

}

@RequestMapping ("/async")

@ResponseBody

public String asyncTest ( )throws Exception

{

Longstart = System. currentTimeMillis(); 记录开始时间

Future<String> task1=asyncService .doTask1() ; 提供线程是否结束的功能

Future<String> task2=asyncService .doTask2 () ;

Future<String> task3=asyncService .doTask3() ;

while ( true )

{

if (task1. isDone () && task2 . isDone () && task3. isDone () )用这个方法进行判断如果三个线程都结束了

{

break; while循环也结束

}

Thread. sleep(1000) ;反复判断连续计算它可能一直不结束所以可以让当前的线程休息后再去判断

Longend = System. currentTimeMillis(); 记录结束时间

return"全部执行完成,总耗时: "+ (end-start) +;"毫秒"

}

这是在 Controller 中调用三个异步执行的功能

3、@EnableAsync//开启异步调用

在启动类中指明异步执行希望在子线程中执行的功能要加上async注解但是还要在启动类中加开启异步调用的注解service也需要扫描所以要加上service的包com. qianfeng .controller", "com. qianfeng. service"

4、返回的是 responsebody最后返回return全部执行完成,总耗时:"'+ (end-start) +"毫秒

5、启动访问路径 async全部执行完成总耗时7084毫秒

image.png

6、可以看到控制台的打印任务一开始结束时间就不是一二三的顺序结束是三一二多线程的执行结果是不确定的先开启的不一定先结束

相关文章
|
消息中间件 JSON 缓存
RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(SpringBoot整合)
RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(SpringBoot整合)
389 0
|
SQL 前端开发 druid
5-TDengine集成SpringBoot,MyBatis,MyBatisPlus
5-TDengine集成SpringBoot,MyBatis,MyBatisPlus
4969 0
5-TDengine集成SpringBoot,MyBatis,MyBatisPlus
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
1868 7
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
827 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
机器学习/深度学习 人工智能 算法
基于YOLOv8的火焰烟雾实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
基于YOLOv8的火焰烟雾实时检测系统,使用6744张图片训练有效模型,开发了带GUI界面的系统,支持图片、视频和摄像头实时检测,具备模型权重导入、检测置信度调节等功能,并提供项目完整代码和数据集。
2289 1
基于YOLOv8的火焰烟雾实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
823 2
|
SQL NoSQL 算法
Neo4j极简教程
图数据库是NoSQL类数据库的一大典型代表,在国内图数据库属于新兴事物,其优异的复杂关系解决方案引起了国内众多大型互联网公司及IT开发者的关注,而Neo4j是目前图形化数据库中最为出色、最为成熟的产品。
1180 0
Neo4j极简教程
|
移动开发 前端开发 JavaScript
|
XML Java Maven
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息
这篇文章详细介绍了如何在Spring Boot项目中使用logback进行日志记录,包括Maven依赖配置、logback配置文件的编写,以及实现的日志持久化和控制台输出效果。
logback在springBoot项目中的使用 springboot中使用日志进行持久化保存日志信息