全网整合营销服务商

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

免费咨询热线: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 


相关文章: 如何在万网自助建站平台快速创建网站?  宝塔面板创建网站无法访问?如何快速排查修复?  建站org新手必看:2024最新搭建流程与模板选择技巧  建站之星如何一键生成手机站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  建站主机SSH密钥生成步骤及常见问题解答?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何通过商城自助建站源码实现零基础高效建站?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  制作网站公司那家好,网络公司是做什么的?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站之星北京办公室:智能建站系统与小程序生成方案解析  广州美橙建站如何快速搭建多端合一网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站之星如何取消后台验证码生成?  如何自定义建站之星网站的导航菜单样式?  如何正确下载安装西数主机建站助手?  公司网站制作价格怎么算,公司办个官网需要多少钱?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  建站VPS配置与SEO优化指南:关键词排名提升策略  如何登录建站主机?访问步骤全解析  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  建站VPS选购需注意哪些关键参数?  如何在阿里云香港服务器快速搭建网站?  建站主机与虚拟主机有何区别?如何选择最优方案?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在建站宝盒中设置产品搜索功能?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  如何在宝塔面板创建新站点?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  广德云建站网站建设方案与建站流程优化指南  建站之星如何快速解决建站难题?  建站之星如何配置系统实现高效建站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何通过服务器快速搭建网站?完整步骤解析  制作网站的软件免费下载,免费制作app哪个平台好?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  如何用美橙互联一键搭建多站合一网站?  详解jQuery停止动画——stop()方法的使用  微信小程序制作网站有哪些,微信小程序需要做网站吗?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  江苏网站制作公司有哪些,江苏书法考级官方网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何在万网自助建站中设置域名及备案?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何打造高效商业网站?建站目的决定转化率  已有域名和空间如何快速搭建网站? 

您的项目需求

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