本篇文章主要介绍了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. centos没有可用软件包 libgtk2

    在编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行,因为centos并未安装gtk,所以运行命令行安装gtksudo yum -y ...

  2. 英语口语练习系列-C39-舞蹈-谈论昨天的活动

    词汇-舞蹈(dancing) ballet body shaking sway the body have a good figure special training arm movement da ...

  3. You must configure either the server or JDBC driver (via the serverTimezone configuration property

    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one ...

  4. (70)Wangdao.com第十一天_JavaScript 日期对象 Date

    日期对象 Date 表示一个时间 Date 对象是 JavaScript 原生的时间库 它以1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒) 时间零点( ...

  5. 使对象可以像数组一样进行foreach循环,要求属性必须是私有

    class myIterator implements Iterator { private $var = array(1, 2, 3, 4, 5); public function __constr ...

  6. linux学习:归档,备份及进程相关命令用法整理

    指令:tar.zip.gzip.unzip.rsync.scp.ps.kill.nohup 压缩 tar 归档命令,不具备压缩功能 tar -zcvf test.tar.gz  test/     # ...

  7. java保留小数后两位的四种写法

    package com.btzh.mis.house.utils; import java.math.BigDecimal;import java.math.RoundingMode;import j ...

  8. 解决archlinux下QT程序,以及wineQQ无法输入中文(.xinitrc)

    昨天安了i3wm,发现fcitx在很多程序中无法输入中文,nixnote2,还有ss-qt5 查了wiki,明明有在~/.xinitrc中加入 export XMODIFIERS=@im=fcitx ...

  9. scheduling while atomic和bad: scheduling from the idle thread(转)

    https://blog.csdn.net/shanzhizi/article/details/22949121 https://blog.csdn.net/wwwtovvv/article/deta ...

  10. 火狐浏览器安装firebug和firepath插件方法(离线)

    1.下载FF55以内版本安装包,安装后在Firefox 更新选择"不检查更新" 2.火狐浏览器各个版本下载地址:http://ftp.mozilla.org/pub/firefox ...