springboot实现异步调用demo
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的更多相关文章
- springboot:异步调用@Async
在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...
- springboot之异步调用@Async
原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...
- springboot实现异步调用
介绍 所谓的异步执行其实就是使用多线程的方式实现异步调用. 异步有什么好处呢? 如果一个业务逻辑执行完成需要多个步骤,也就是调用多个方法去执行, 这个时候异步执行比同步执行相应更快.不过要注意异步请求 ...
- SpringBoot的异步调用介绍
参考博客: https://www.cnblogs.com/jebysun/p/9675345.html https://blog.csdn.net/weixin_38399962/article/d ...
- springboot的异步调用
package com.handsight.platform.fras.aapp; import java.util.Locale; import org.slf4j.Logger; import o ...
- Swoole实时任务异步调用Demo
server.php <?php class Server { private $serv; private $logFilePath = "/data/wwwroot/houtai/ ...
- SpringBoot中异步请求和异步调用(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...
- spring boot实现异步调用
今天在这里学习下使用springboot的异步调用async 首先使用@EnableAsync开启异步功能 /** * @author fengzp * @date 17/5/8 * @email f ...
- springBoot中实现自定义属性配置、实现异步调用、多环境配置
springBoot中其他相关: 1:springBoot中自定义参数: 1-1.自定义属性配置: 在application.properties中除了可以修改默认配置,我们还可以在这配置自定义的属性 ...
- 一个简单的webservice的demo(下)winform异步调用webservice
绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...
随机推荐
- SQLServer统计监控SQL执行计划突变的方法
使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图.以下是一些可以用于此目的的DMVs以及相应的查询示例: sys.dm_exec_query_ ...
- C语言:通讯录程序设计(多功能)
回顾我的代码shi 通讯录程序设计 主函数 遇到的困难 补充标注说明(一定要看) 效果展示截图 结语 程序源代码 通讯录程序设计 作者前言:该通讯录作品是我大一的C语言结课作业,代码像shi山一样,之 ...
- C语言:输出大写的三角形字母表(进阶)
//该程序只支持输入大写字母,输入G,就输出A~G的三角形字母表 /* 从A到Z的输出数量应该是1 3 5 7 9..... */ 利用这个特性,对空格和字母进行输出 A字母在 ...
- 2022年官网下安装Tomcat最全版与官网查阅方法
目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 ...
- Laravel框架中数据库分表时Model使用方法
前言: 0.最近在使用laravel框架做MySQL分表的时候经过实践和踩坑,总结了以下3种可行的分表方法,亲测可用. 1.本人公司做的是SaaS系统,以店铺为维度.店铺id(shop_id) 命名规 ...
- ECMA 2023(ES14) 新特性
ECMAScript 2023 主要包含内容 ECMAScript 2023 于 2023 年 6 月 27 日获得 ECMA International 的批准. ECMAScript 是标准化的 ...
- 为WPF框架Prism注册Nlog日志服务
这篇文章介绍了为WPF框架Prism注册Nlog日志服务的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 无论是Nlog还是Serilog, 它们都提供 ...
- springboot~封装依赖引用包jar还是pom,哪种更规范
将多个第三方包封装成一个项目后,如果你的目的是让其他开发人员可以直接引用这些依赖,一般来说有两种常见的方式: 打成JAR包:将封装好的项目编译打包成JAR文件,其他开发人员可以将这个JAR文件添加到他 ...
- map和解构赋值的拷贝
map遍历之后返回的数组是深拷贝,解构赋值一维的是深拷贝,二维是浅拷贝
- java 日期 时间
方法一(线程不安全, 不建议使用)private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...