本篇文章主要介绍了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. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  2. 对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

    在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完. 2018.7.18更新: 正好在参加杭州UnrealCircle的时候见到 ...

  3. [CF542A]Place Your Ad Here

    [CF542A]Place Your Ad Here 题目大意: 有\(n(n\le2\times10^5)\)个广告和\(m(m\le2\times10^5)\)个电视台,第\(i\)个广告只能在\ ...

  4. SQLyog 最新版本12.5-64bit 完美破解,亲测可用!

    声明:本文只是提供一个网络上找到的针对12.5版本的注册码使用方式做一个说明,不建议企业用户破解,有条件的还是希望大家购买原版.当然个人学习用的但又不想购买原版的,这里只是提供个途径,请勿用做商业用途 ...

  5. 2017-2018 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2017)

    A. Cakey McCakeFace 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string.h&g ...

  6. VS的Mvc项目右键没有控制器右键菜单(转)

    今天遇到了一个比较少见的问题,我用vs2012打开一个从Svn上拉下来的mvc5项目,在Controller文件夹上右键却发现没有新建控制器的选项,在View文件夹上右键也没有新建视图的选项. 我的第 ...

  7. mysql 连接超慢

    cd /etc/mysql/mysql.conf.dsudo vi mysqld.cnf加上最后一句skip-name-resolve, 如下:[mysqld]## * Basic Settings# ...

  8. socket(套接字)初使用

    socket层 socket:是应用层与TCP/IP协议通信的中间软件抽象层,是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面. 基于T ...

  9. Robot Framework 1

    about Robot, learnt from the following document, perfect document !!!! http://www.virtuousprogrammer ...

  10. Rabbitmq消息持久化

    1.交换机持久化设置 exchange 持久化,在声明时指定 durable未true 2.队列持久化设置 queue 持久化,在声明时指定 durable 为true 3.消息持久化设置 Deliv ...