本篇文章主要介绍了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. [转] Java程序员学C#基本语法两个小时搞定(对比学习)

    Java程序员学C#基本语法两个小时搞定(对比学习)   对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...

  2. [BZOJ1984][Luogu4315]月下“毛景树”

    题目大意 给出一棵 n 个点的无根树,待边权,要求维护一下操作: 修改某条边的边权 修改点 u 到点 v 路径上所有边的边权 点 u 到点 v 路径上所有边的边权加上某个值 查询点 u 到点 v 路径 ...

  3. CMake入门

    CMake入门 CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似 ...

  4. golang str 首字母大写

    首字母大写 //如果是小写字母, 则变换为大写字母 func strFirstToUpper(str string) string { if len(str) < 1 { return &quo ...

  5. Mac_安装Homebrew以及Maven

    Mac OSX上的软件包管理工具,安装软件或者卸载软件. 打开终端输入(如不行,可参考homebrew官网): ruby -e "$(curl -fsSL https://raw.githu ...

  6. __x__(5)0905第二天__网页三大组成部分

    根据 W3C 标准,将网页主要分成 3 个部分:结构,表现,行为. 结构: HTML 用于描述页面结构. 表现: CSS 用于控制页面中元素的样式. 行为: JavaScript 用于响应用户操作.

  7. amoeba实现读写分离

    amoeba的运行环境依靠java的jdk: 下面执行amoeba的安装不走 # mkdir /usr/local/src/amoeba 上传文件:amoeba-mysql-binary-2.2.0. ...

  8. Nginx 自定义404、500、502 页面

    利用nginx的反向代理来实现 服务器404 和500 等状态码的自定义页面 1.nginx配置文件 nginx.conf 配置开启代理错误拦截 和配置页面  下划线部分  http { ...... ...

  9. verilog中signed的使用

    1.在verilog中有时会用signed修饰符来修饰定义的数据,运算的时候也会用$signed()任务来强制转换数据,那么signed的修饰是为什么呢,是为了区分有符号数和无符号数的加法和乘法吗?其 ...

  10. linux CentOS YUM 安装 nginx+tomcat+java+mysql运行环境

    Java环境配置 1 安装JDK 查看CentOS自带JDK是否已安装 1 [root@test ~]# yum list installed |grep java 若有自带安装的JDK,应如下操作进 ...