本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  什么是“异步调用”?

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

  同步调用

  下面通过一个简单示例来直观的理解什么是同步调用:

  定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  23

  24

  25

  26

  27

  28

  29

  30

  31

  32

  33

  34

  35

  36

  37

  38

  39

  40

  41

  42package 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) + "毫秒");

  }

  }

  编写一个访问方法:

  ?

  1

  2

  3

  4

  5

  6

  7

  8//测试task1.

  @RequestMapping("/task1")

  public String task1() throws Exception{

  task1.doTaskOne();

  task1.doTaskTwo();

  task1.doTaskThree();

  return"task1";

  }

  运行可以看到类似如下输出:

  开始做任务一

  完成任务一,耗时:4156毫秒

  开始做任务二

  完成任务二,耗时:557毫秒

  开始做任务三

  完成任务三,耗时:6171毫秒

  异步调用

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

  在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,Task类改在为如下模式:

  ?

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  23

  24

  25

  26

  27

  28

  29

  30

  31

  32

  33

  34

  35

  36

  37

  38

  39

  40

  41

  42

  43

  44

  45

  46package 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,如下所示:

  ?

  1

  2

  3

  4

  5

  6

  7@SpringBootApplication

  @EnableAsync

  publicclass App {

  //省略其它代码…

  }

  编写测试方法:

  ?

  1

  2

  3

  4

  5

  6

  7

  8//测试task2.

  @RequestMapping("/task2")

  public String task2() throws Exception{

  task2.doTaskOne();

  task2.doTaskTwo();

  task2.doTaskThree();

  return"task2";

  }

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

  开始做任务一

  开始做任务二

  开始做任务三

  完成任务三,耗时:57毫秒

最新资讯 最新动态 关注两性健康 关注两性健康网

  完成任务二,耗时:3621毫秒

  完成任务一,耗时:7419毫秒

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  原文链接:http://412887952-qq-com.iteye.com/blog/2309126

spring boot中使用@Async实现异步调用任务的更多相关文章

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

    在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsyn ...

  2. 56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...

  3. Spring Boot中使用@Async实现异步调用,加速任务的执行!

    什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行 ...

  4. Spring Boot中使用@Async的时候,千万别忘了线程池的配置!

    上一篇我们介绍了如何使用@Async注解来创建异步任务,我可以用这种方法来实现一些并发操作,以加速任务的执行效率.但是,如果只是如前文那样直接简单的创建来使用,可能还是会碰到一些问题.存在有什么问题呢 ...

  5. Spring Boot2.0之@Async实现异步调用

    补充一个知识点: lombok底层原理使用的是: 字节码技术ASM修改字节码文件,生成比如类似于get() set( )方法 一定要在开发工具安装 在编译时候修改字节码文件(底层使用字节码技术),线上 ...

  6. Spring Boot中实现异步调用之@Async

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

  7. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...

  8. Spring Boot使用@Async实现异步调用

    原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...

  9. Spring @Async实现异步调用示例

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

随机推荐

  1. Imcash科普:没有网络也可以转账比特币?你可能有些误解

    近日,据Bitcoinist消息,比特币解决方案开发商CoinKite联合创始人Rodolfo Novak和OpenBazaar联合创始人Sam Patterson在推特上宣布,两人不借助互联网和卫星 ...

  2. 网络流之最大流Dinic算法模版

    /* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using ...

  3. 第八篇 Flask配置

    Flask 是一个非常灵活且小而精的web框架 , 那么灵活性从什么地方体现呢? 列如  Flask配置,这个东西怎么用呢? 它能给我们带来怎么样的方便呢? app配置 首先展示一下: from fl ...

  4. JS简单实现分页显示

    完整代码源码可以在这里下载 1.在 HTML文件建立列表目标节点和翻页器目标节点 <body> <!--页面控制器 --> <div id="nav" ...

  5. 明天开始学习 Hibernate

    明天开始学 Hibernate ,想简单的了解一下 Hibernate,也借此机会了解一下 ORM 计划用 5 天的时间看完,包括整理笔记 加油吧,少年~~

  6. c++11 线程池

    也可参考: https://www.cnblogs.com/ailumiyana/p/10016965.html *** https://blog.csdn.net/jlusuoya/article/ ...

  7. EMI优化

    一般印刷电路板之间的高速信号线路无法通过FCC和VDE辐射测试. 优化方案有以下3种: 1.高频滤波 通常做法在每个逻辑驱动器上串联一个小阻抗,并经过一个旁路电容接地. 旁路电容接地需足够干净,如机箱 ...

  8. module.exports 和 exports(转)

    CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的modu ...

  9. JavaBean,POJO,VO,DTO的区别和联系

    JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...

  10. 第三周学习java第四章学习总结及体会!

    第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...