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. EasyExcel处理Mysql百万数据的导入导出案例,秒级效率,拿来即用!

    一.写在开头 今天终于更新新专栏 <EfficientFarm> 的第二篇博文啦,本文主要来记录一下对于EasyExcel的高效应用,包括对MySQL数据库百万级数据量的导入与导出操作,以 ...

  2. Atera 用户为最终用户提供对办公计算机的远程访问

    ​一言以蔽之:由 Splashtop 提供支持的 Atera 的客户远程访问功能允许使用 Atera 的 MSP 设置和管理其最终用户对办公计算机的远程访问. 新冠肺炎大流行已加速了全球远程工作的进程 ...

  3. 2020版IDEA配置Tomcat 10出现卡主问题

    问题描述 配置了2020版的IDE和Tomcat,但是产生了,日志打印中途,卡住了的问题,如图: 18-Aug-2021 00:46:09.763 信息 [main] org.apache.catal ...

  4. PageOffice 在线打开 word 文件并添加水印

    一.服务器端方法插入水印 1.插入文字水印 WordDocument doc = new WordDocument(); //添加水印 ,设置水印的内容 doc.getWaterMark().setT ...

  5. java学习之旅(day.07)

    面向对象编程(oop) 面向过程思想:线性思维 步骤清晰简单,每一步做什么很明确 适合处理较为简单地问题 面向对象思想:总分 抽象 属性+方法=类 分类的思维模式,思考问题首先会解决问题需要哪些分类, ...

  6. 【漏洞复现】用友NC uapjs RCE漏洞(CNVD-C-2023-76801)

    产品介绍 用友NC是一款企业级ERP软件.作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计.采购管理.销售管理.物料管理.生产计划和人力资源管理等,帮助企业实现数字化转型和高效管 ...

  7. 大数据之Hadoop的HDFS存储优化—异构存储(冷热数据分离)

    异构存储主要解决,不同的数据,储存在不同类型的硬盘中,达到最佳性能的问题 1)存储类型 RAM_DISK:内存镜像文件系统 SSD:SSD固态硬盘 DISK:普通磁盘,在HDFS中,如果没有主动声明数 ...

  8. 安卓开发封装处理Retrofit协程请求中的异常

    上篇文章讲解了怎么使用Kotlin的协程配合Retrofit发起网络请求,使用也是非常方便,但是在处理请求异常还不是很人性化.这篇文章,我们将处理异常的代码进行封装,以便对异常情况返回给页面,提供更加 ...

  9. openssl 生成多域名 多IP 的数字证书

    openssl.cnf 文件内容: [req] default_bits = 2048 distinguished_name = req_distinguished_name copy_extensi ...

  10. jsonp原理详解——终于弄明白了JSONP

    什么是JSONP? 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,着用自己的方式来阐释一下这个问题,看看是否有帮助. 1.一个众所周知的问题, ...