当前位置: 首页 > news >正文

@Async注解提升Spring Boot项目中API接口并发能力

文章目录

  • 同步调用
  • 异步调用
        • 1: 启用异步支持
        • 2: 修改 Task 类
  • 异步回调
        • 基本概念
        • 使用 Future<String>
        • 使用 CompletableFuture<String>
        • Future<String> 和 CompletableFuture<String>区别
          • 1. 基本概念
          • 2. 主要区别
  • 业务场景

同步调用

同步调用是最直接的调用方式,调用方发起请求后会阻塞等待服务端返回结果,直到得到响应或超时。这种方式简单直观,但可能因为等待响应而降低系统的整体性能。
下面定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)

@Component
public class Task {public static Random random =new Random();public void doTaskOne() throws Exception {System.out.println("开始做任务一");long start = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end = System.currentTimeMillis();System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");}public void doTaskTwo() throws Exception {System.out.println("开始做任务二");long start = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end = System.currentTimeMillis();System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");}public void doTaskThree() throws Exception {System.out.println("开始做任务三");long start = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end = System.currentTimeMillis();System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");}}

@Component

是 Spring 框架中的一个注解,主要用于标记一个 Java 类作为 Spring 的 Bean。Spring 的 IoC(Inversion of Control,控制反转)容器会管理这些 Bean 的生命周期和配置。@Component 是一个通用的注解,可以用于任何 Spring 管理的组件。
结果展示:
在这里插入图片描述

  1. 每个任务的实际执行时间是不同的,这与 Thread.sleep(random.nextInt(10000)) 有关,它会让线程暂停一个介于0到9999毫秒之间的随机时间。
  2. 从输出顺序来看,这些任务是按顺序执行的,即一个任务完成后才会开始下一个任务。这意味着这三个方法是在同一个线程中依次调用的,没有采用多线程或异步处理的方式。
  3. 由于使用了 Random 类来生成等待时间,所以每次运行程序时,每个任务的实际耗时都会有所不同。

异步调用

在 Spring Boot 中,使用 @Async 注解可以非常方便地将一个方法转换为异步执行。但是为了使 @Async 生效,还需要一些额外的配置。下面是一个具体的示例,展示如何修改您的 Task 类以支持异步执行,并且确保 Spring Boot 应用能够正确配置异步支持。

1: 启用异步支持
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2: 修改 Task 类

接下来,修改 Task 类中的方法,使其能够异步执行。你需要在每个希望异步执行的方法上加上 @Async 注解。

package com.main.service;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import java.util.Random;@Component
public class Task {public static Random random = new Random();@Asyncpublic void doTaskOne() throws Exception {System.out.println("开始做任务一");long start = System.currentTimeMillis();Thread.sleep(random.nextInt(10000));long end = System.currentTimeMillis();System.out.printl

http://www.mrgr.cn/news/67131.html

相关文章:

  • 纯前端生成PDF(jsPDF)并下载保存或上传到OSS
  • Python常用脚本集锦
  • 面向 TP 场景能力全面升级, OceanBase 4.2.5 LTS 版正式发布
  • 【vim文本编辑器gcc编译器gdb调试器】
  • C#与C++交互开发系列(十八):跨进程通信之命名管道(Named Pipes)
  • 【ESP32+MicroPython】单位数码管使用
  • Redis主从复制
  • 华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
  • 『VUE』20. 组件嵌套关系page(详细图文注释)
  • day-80 长度为 K 的子数组的能量值 I
  • 思维导图工具有哪些?10款思维导图特色介绍
  • ML 系列:机器学习和深度学习的深层次总结( 20)— 离散概率分布 (Bernoulli 分布)
  • 国际版JAVA同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5
  • LSTM结构原理
  • 自动化测试中使用Pytest Fixture?推荐10种常见用法!
  • 【k8s】ClusterIP能http访问,但是不能ping 的原因
  • SpringAI QuickStart
  • C++练习题(2)
  • 2024亚太杯数学建模思路+代码+模型预定(更新见文末名片)
  • C语言---程序设计基础练习题目3
  • 修改elementUI等UI组件样式的5种方法总结,哪些情况需要使用/deep/, :deep()等方式来穿透方法大全
  • 【系统分析师】-案例-综合知识大全
  • 【AI换装整合包及教程】OOTDiffusion: AI换装工具的革命性创新
  • PAT 甲级 1076 Forwards on Weibo(30)
  • SparkSql输出数据的方式
  • 代码要走的路:编程“三部曲”