异步调用|学习笔记

简介: 快速学习异步调用

开发者学堂课程【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、可以看到控制台的打印任务一开始结束时间就不是一二三的顺序结束是三一二多线程的执行结果是不确定的先开启的不一定先结束

相关文章
|
8天前
|
Java
java线程之异步回调
java线程之异步回调
9 0
|
2月前
|
Java
异步调用的接口设计
异步调用的接口设计
17 0
|
9月前
|
XML Java 数据格式
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇
53 0
|
9月前
|
Java Spring
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇2
异步编程 - 08 Spring框架中的异步执行_TaskExecutor接口和@Async应用篇2
82 0
|
9月前
3 # 通过回调函数处理异步并发问题
3 # 通过回调函数处理异步并发问题
28 0
|
9月前
|
Java 数据库 数据安全/隐私保护
【CompletableFuture事件驱动异步回调】
【CompletableFuture事件驱动异步回调】
|
11月前
|
前端开发 Java 测试技术
SpringBoot-27- @Async实现异步调用 什么是异步调用
异步调用是相对于同步调用的,同步调用是按照顺序进行执行任务,只有上一个任务执行完成下一个任务才能执行,异步调用是指在按照顺序执行任务的过程中不需要等待任务结果的出现,就可以顺序执行下一个任务。
70 0
|
10月前
|
Python
同步调用和异步调用
同步调用和异步调用
|
前端开发
前端学习案例2-回调和异步
前端学习案例2-回调和异步
58 0
前端学习案例2-回调和异步
|
消息中间件 缓存 前端开发
同步转异步处理|学习笔记
快速学习同步转异步处理
140 0
同步转异步处理|学习笔记