springboot实现异步调用

异步调用特点

异步调用在开发程序中被广泛应用,在异步任务中,主线程不需要阻塞等待异步任务的完成,而是可以继续处理其他请求。

异步调用的特点如下:

  • 非阻塞:主线程在调用异步方法后不会等待其完成,而是立即返回。
  • 后台处理:耗时操作在后台独立的线程中执行,不会阻塞主线程。
  • 资源利用率高:通过异步处理,可以更有效地利用系统资源,尤其是在需要处理大量并发请求时。
  • 响应速度快:客户端会立即收到响应,而不需要等待耗时操作完成

线程池

线程池是一种基于池化思想管理和使用线程的机制。

它是将多个线程预先存储在一个“池子”内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从“池子”内取出相应的线程执行对应的任务即可。

线程池优点

  • 降低资源消耗(复用线程,减少线程频繁新建、销毁等带来的开销)
  • 提高响应速度
  • 提高线程的可管理性

线程池任务执行流程如图所示

线程池主要参数

本例子是利用ThreadPoolExecutor创建的线程,主要参数如下所示:

  • setCorePoolSize:核心线程数,线程池中始终存活的线程数。
  • setMaxPoolSize:设置最大线程池大小,池中允许的最大线程数。
  • setQueueCapacity:设置队列容量,当核心线程已满时,用于保存等待执行的任务的队列。
  • initialize:初始化线程池

配置类代码

@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}

AsyncConfig 类通过配置 ThreadPoolTaskExecutor 来管理异步任务的执行,设置了核心线程池大小、最大线程池大小、任务队列容量和线程名前缀等参数,并通过 @EnableAsync 注解启用了Spring的异步方法执行功能。

这样,当其他类中使用 @Async 注解标记的方法被调用时,异步任务将由配置的 taskExecutor 来执行。

服务类代码

@Service
public class AsyncService
{
@Async
public void performAsyncTask() {
System.out.println("Start async task - " + Thread.currentThread().getName());
try{
Thread.sleep(2000); }catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("End async task - " + Thread.currentThread().getName());
} @Async
public void performAnotherAsyncTask() {
System.out.println("Start another async task - " + Thread.currentThread().getName());
try {
// 模拟长时间的任务
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End another async task - " + Thread.currentThread().getName());
}
}

测试控制类代码

@RestController
@RequestMapping("/async")
public class AsyncController {
@Autowired
AsyncService asyncService;
@GetMapping("/test")
@UnInterception
public String test() {
System.out.println("Controller method call - " + Thread.currentThread().getName());
asyncService.performAsyncTask();
asyncService.performAnotherAsyncTask();
return "success";
}
}

运行结果





访问/async/test后,控制器会立即返回响应,而不会等待异步任务的完成,这正是体现了异步的特点,通过这种方式,可以提高系统的并发性和响应速度。

springboot实现异步调用demo的更多相关文章

  1. springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  2. springboot之异步调用@Async

    原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...

  3. springboot实现异步调用

    介绍 所谓的异步执行其实就是使用多线程的方式实现异步调用. 异步有什么好处呢? 如果一个业务逻辑执行完成需要多个步骤,也就是调用多个方法去执行, 这个时候异步执行比同步执行相应更快.不过要注意异步请求 ...

  4. SpringBoot的异步调用介绍

    参考博客: https://www.cnblogs.com/jebysun/p/9675345.html https://blog.csdn.net/weixin_38399962/article/d ...

  5. springboot的异步调用

    package com.handsight.platform.fras.aapp; import java.util.Locale; import org.slf4j.Logger; import o ...

  6. Swoole实时任务异步调用Demo

    server.php <?php class Server { private $serv; private $logFilePath = "/data/wwwroot/houtai/ ...

  7. SpringBoot中异步请求和异步调用(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...

  8. spring boot实现异步调用

    今天在这里学习下使用springboot的异步调用async 首先使用@EnableAsync开启异步功能 /** * @author fengzp * @date 17/5/8 * @email f ...

  9. springBoot中实现自定义属性配置、实现异步调用、多环境配置

    springBoot中其他相关: 1:springBoot中自定义参数: 1-1.自定义属性配置: 在application.properties中除了可以修改默认配置,我们还可以在这配置自定义的属性 ...

  10. 一个简单的webservice的demo(下)winform异步调用webservice

    绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...

随机推荐

  1. 计算机组成原理—中央处理器CPU

    文章目录 CPU的功能与架构 CPU的组成 运算器 控制器 指令执行过程 指令流程 指令执行方案 数据通路 单总线结构 专用通路结构 硬布线控制器设计 硬布线执行流程 硬布线CU内部 怎么设计微操作的 ...

  2. springcloud整合stream解决项目升级的多个消息中间件的收发问题

    cloud stream (一)简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架.它可以基于 Spring Boot 来创建独立的.可用于生产的 Spring ...

  3. spring boot整合maybatis plus 的 文件生成代码

    /** * 代码生成 */public class AutoGenerator_ { public static void main(String[] args) { AutoGenerator ge ...

  4. python之Faker库如果构造用户信息测试数据

    代码链接1:https://blog.csdn.net/qq_38484679/article/details/115244711 补充代码链接0:https://blog.csdn.net/weix ...

  5. k8s集群下node节点使用kubectl命令

    问题描述:The connection to the server localhost:8080 was refused - did you specify the right host or por ...

  6. itest work(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.5. Rc4

    (一)itest work 简介 itest work (爱测试)  一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...

  7. vue 的时间格式化

    大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...

  8. windows报错

    如果说你dns没有权威的话1.先去long.com上面右键属性把"区域传送给所有服务器打勾"2.右键属性,在名称分析器中,输入要添加为辅助dns的服务器的ip显示解析成功就可以了

  9. 常见距离计算的Python实现

    常见的距离有曼哈顿距离.欧式距离.切比雪夫距离.闵可夫斯基距离.汉明距离.余弦距离等,用Python实现计算的方式有多种,可以直接构造公式计算,也可以利用内置线性代数函数计算,还可以利用scipy库计 ...

  10. ETL工具-nifi干货系列 第十三讲 nifi处理器QueryDatabaseTable查询表数据实战教程

    1.处理器QueryDatabaseTable,该组件生成一个 SQL 查询,或者使用用户提供的语句,并执行它以获取所有在指定的最大值列中值大于先前所见最大值的行.查询结果将被转换为 Avro 格式, ...