全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

spring boot中使用@Async实现异步调用任务

什么是“异步调用”?

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

 同步调用

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

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

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

 编写一个访问方法:

//测试task1.
  @RequestMapping("/task1")
  public String task1() throws Exception{
    task1.doTaskOne();
    task1.doTaskTwo();
    task1.doTaskThree();
    return"task1";
  }

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

开始做任务一

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

开始做任务二

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

开始做任务三

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

 异步调用

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

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

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

@SpringBootApplication
@EnableAsync
publicclass App {

  //省略其它代码…

}

编写测试方法:

//测试task2.
  @RequestMapping("/task2")
  public String task2() throws Exception{
    task2.doTaskOne();
    task2.doTaskTwo();
    task2.doTaskThree();
    return"task2";
  }

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

开始做任务一

开始做任务二

开始做任务三

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

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

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

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


# spring  # boot  # 异步调用  # async  # async异步执行  # spring boot使用自定义配置的线程池执行Async异步任务  # spring boot异步(Async)任务调度实现方法  # SpringBoot实现定时任务和异步调用  # SpringBoot用@Async注解实现异步任务  # Springboot任务之异步任务的使用详解  # 详细讲解springboot如何实现异步任务  # SpringBoot详细讲解异步任务如何获取HttpServletRequest  # Spring Boot小型项目如何使用异步任务管理器实现不同业务间的解耦  # 完成任务  # 可以看到  # 的是  # 就能  # 主程序  # 执行时间  # 要在  # 不存在  # 只需要  # 所示  # 用在  # 这三个  # 较长  # 还需  # 就比  # 大家多多  # 单元测试  # 都必须  # author  # Component 


相关文章: 如何在阿里云高效完成企业建站全流程?  香港服务器部署网站为何提示未备案?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何在Windows虚拟主机上快速搭建网站?  网站app免费制作软件,能免费看各大网站视频的手机app?  家庭建站与云服务器建站,如何选择更优?  如何在建站宝盒中设置产品搜索功能?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何在建站之星网店版论坛获取技术支持?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何通过二级域名建站提升品牌影响力?  建站之星导航配置指南:自助建站与SEO优化全解析  如何在Windows服务器上快速搭建网站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  盐城做公司网站,江苏电子版退休证办理流程?  已有域名和空间如何快速搭建网站?  如何快速重置建站主机并恢复默认配置?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何在建站主机中优化服务器配置?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站图片在线制作软件,怎么在图片上做链接?  如何在阿里云虚拟服务器快速搭建网站?  如何正确下载安装西数主机建站助手?  建站主机服务器选型指南与性能优化方案解析  如何快速生成高效建站系统源代码?  建站VPS选购需注意哪些关键参数?  小程序网站制作需要准备什么资料,如何制作小程序?  如何通过VPS建站实现广告与增值服务盈利?  外贸公司网站制作哪家好,maersk船公司官网?  建站主机如何选?性能与价格怎样平衡?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何通过服务器快速搭建网站?完整步骤解析  动图在线制作网站有哪些,滑动动图图集怎么做?  官网网站制作腾讯审核要多久,联想路由器newifi官网  如何在阿里云域名上完成建站全流程?  深圳网站制作的公司有哪些,dido官方网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  宝塔新建站点为何无法访问?如何排查?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  网站好制作吗知乎,网站开发好学吗?有什么技巧?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  黑客如何通过漏洞一步步攻陷网站服务器?  建站DNS解析失败?如何正确配置域名服务器?  家具网站制作软件,家具厂怎么跑业务?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。