SpringBoot异步调用方法并接收返回值
作者:myCat、 发布时间:2023-08-16 22:33:49
标签:SpringBoot,异步调用,返回值
项目中肯定会遇到异步调用其他方法的场景,比如有个计算过程,需要计算很多个指标的值,但是每个指标计算的效率快慢不同,如果采用同步执行的方式,运行这一个过程的时间是计算所有指标的时间之和。比如:
方法A:计算指标x,指标y,指标z的值,其中计算指标x需要1s,计算指标y需要2s,指标z需要3s。最终执行完方法A就是5s。
现在用异步的方式优化一下
方法A异步调用方法B,方法C,方法D,方法B,方法C,方法D分别计算指标x,指标y,指标z的值,那么最终执行完方法A的时间则是3s。
步骤1:配置线程池,添加@Configuration和@EnableAsync注解
@Configuration
@EnableAsync
public class ExecutorConfig {
/**
* 线程池
*
* @return
*/
@Bean(name = "asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(15);
executor.setQueueCapacity(25);
executor.setKeepAliveSeconds(200);
executor.setThreadNamePrefix("async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务都完成再继续销毁其他的Bean
executor.setWaitForTasksToCompleteOnShutdown(true);
// 线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
步骤2:定义方法A,方法B,方法C,方法D
@Service
public class AsyncService {
@Async("asyncExecutor")
public Future<Integer> methodB(){
try{
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
return new AsyncResult<>(1);
}
@Async("asyncExecutor")
public Future<Integer> methodC(){
try{
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
return new AsyncResult<>(2);
}
@Async("asyncExecutor")
public Future<Integer> methodD(){
try{
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
return new AsyncResult<>(3);
}
}
@GetMapping("test")
public Integer methodA() throws Exception{
long start = System.currentTimeMillis();
Future<Integer> future1 = asyncService.methodB();
Future<Integer> future2 = asyncService.methodC();
Future<Integer> future3 = asyncService.methodD();
Integer x = future1.get();
Integer y = future2.get();
Integer z = future3.get();
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
return x + y +z;
}
}
结果:
来源:https://blog.csdn.net/WYA1993/article/details/88552274


猜你喜欢
- 何谓函数式编程相信大家在实际的开发中,很多情况下完成一个功能都需要借助多个类,那么我们这里的基本单元就是类。而函数式编程则更加细化,致使我们
- 文件格式分别如下 package txtobject ReadTxt {def readFromTxtBy
- 一、需求描述拼图是一款益智类经典游戏了,本游戏学习了一些前辈们的经验,整体来说讲,将图片用切图工具进行切割,监听用户手指滑动事件,当用户对凌
- 我们经常会将数据源放在DataTable里面,但是有时候也需要移除不想要的行,下面的代码告诉你们DataTable dts;DataRow[
- 茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(继
- 这篇文章主要介绍了通过实例了解spring使用构造器注入的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- java ,javaw 和 javaws 的区别:首先,所有的这些都是java的启动装置,java.e
- using Microsoft.Win32 ; 1.读取指定名称的注册表的值 &nbs
- 前言在上篇文章(Android实现圆弧滑动效果之ArcSlidingHelper篇)中,我们把圆弧滑动手势处理好了,那么这篇文章我们就来自定
- 前言目前正在做的项目,为了增加用户的体验度,准备增加一些动画效果,其中底部栏中间按钮的点击事件参考了闲鱼的动效,便在此基础上仿写了该动效,并
- 前言java有八个基本数据类型,每个都有对应的一个包装类,比如int对应的Integer。 Integer 是int的包装类型,数据类型是类
- 本文实例讲述了winform用datagridview制作课程表的方法。分享给大家供大家参考。具体分析如下:课程表的最终效果如下图所示:具体
- 定义:用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。特点: 1、它支持以不同的方式遍历一个
- 在某种场景下,可能我们需要获取app的图标名称和启动图片的名称。比如说app在前台时,收到了远程通知但是通知栏是不会有通知提醒的,这时我想做
- 源码地址:https://gitee.com/fighter3/eshop-project.git持续更新中……大家好,我是三分恶。这一节我
- Task的MSDN的描述如下:【Task类的表示单个操作不会返回一个值,通常以异步方式执行。Task对象是一种的中心思想基于任务的异步模式首
- 首先是“饿了么”导航Tab栏悬浮的效果图。大家可以看到上图中的“分类”、“排序”、“筛选”会悬浮在app的顶部,状态随着ScrollView
- 下截JNative组件jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2解压JNati
- 当多个界面都有很多相似部分时,可以考虑创建一个功能较全的模板。而在需要时,可以通过引用模板来实现自己想要实现的功能。比如适配器 Adapte
- 本文实例为大家分享了Android匹配关键字标红的具体代码,供大家参考,具体内容如下1. 单关键字匹配若只需匹配 搜索内容 可以