CompletableFuture多任务异步,获取返回值,汇总结果
线程池异步的基础知识
详情见:https://blog.csdn.net/sinat_32502451/article/details/133039624
线程池执行多任务,获取返回值
线程池的 submit()方法,可以提交任务,并返回 Future接口。
而 future.get(),可以获取到任务的结果,但是get()方法会阻塞,阻塞时间过长,会占用过多的系统资源。
因此在使用时,一般都会用 get(long timeout, TimeUnit unit) 设置超时时间。
//该线程池仅用于示例,实际建议使用自定义的线程池
ExecutorService executor = Executors.newCachedThreadPool();
Future<String> future = executor.submit(() -> "task1");
//阻塞,获取返回值,2秒超时
String result = future.get(2, TimeUnit.SECONDS);
不过,get(long timeout, TimeUnit unit) 比较适合设置单个任务的超时时间,在多任务的情况下,哪怕设置了超时时间,阻塞的时间也会特别长。
比如,有5个任务同时执行,每个任务设置2s的超时时间,在极端情况下,这些任务全部阻塞并超时,那总共要耗费的时间,可能会达到10s,这明显是不能接受的。
如果超时时间设置得太小,又可能出现频繁超时。在多任务获取返回值的场景,更适合使用 CompletableFuture。
CompletableFuture基础知识
详情见: https://blog.csdn.net/sinat_32502451/article/details/132819472
CompletableFuture多任务异步
CompletableFuture多任务异步,不需要返回值的话,主要使用 allOf()。
- allOf():就是将多个任务汇总成一个任务,所有任务都完成时触发。allOf()可以配合get()一起使用。
public static void allOfTest() throws Exception {ExecutorService executorService = Executors.newCachedThreadPool();CompletableFuture<Void> cf1 = CompletableFuture.runAsync(() -> System.out.println("cf1 ok."), executorService);CompletableFuture<Void> cf2 = CompletableFuture.runAsync(() -> System.out.println("cf2 ok."), executorService);//将两个任务组装成一个新的任务,总共的超时时间为2sCompletableFuture.allOf(cf1, cf2).get(2, TimeUnit.SECONDS);}
CompletableFuture获取返回值
只有一个任务时,CompletableFuture的使用,跟线程池异步有点类似。
主要用到 CompletableFuture.supplyAsync(): 异步处理任务,有返回值。
public static void supplyAsyncGet() {//该线程池仅用于示例,实际建议使用自定义的线程池ExecutorService executorService = Executors.newCachedThreadPool();CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(()-> runTask(), executorService);String result = null;try {//获取返回值,2秒超时result = completableFuture.get(2, TimeUnit.SECONDS);} catch (Exception e) {logger.error("completableFuture.get error.", e);}logger.info("result:"+result);}private static String runTask() {try {//任务耗时。可以分别设置1000和3000,看未超时和超时的不同结果。Thread.sleep(1000);} catch (InterruptedException e) {logger.error("runTask error.", e);}return "taskResult";}
CompletableFuture多任务异步,获取返回值,汇总结果
有几个方法比较关键:
- supplyAsync(): 异步处理任务,有返回值
- whenComplete():任务完成后触发,该方法有返回值。还有两个参数,第一个参数是任务的返回值,第二个参数是异常。
- allOf():就是所有任务都完成时触发。allOf()可以配合get()一起使用。
示例如下:
/*** 异步,多任务。汇总返回值*/public static void allOfGet() {//该线程池仅用于示例,实际建议使用自定义的线程池ExecutorService executorService = Executors.newCachedThreadPool();//线程安全的list,适合写多读少的场景List<String> resultList = Collections.synchronizedList(new ArrayList<>(50));CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> runTask("result1", 1000), executorService).whenComplete((result, throwable) -> {//任务完成时执行。用list存放任务的返回值if (result != null) {resultList.add(result);}//触发异常if (throwable != null) {logger.error("completableFuture1 error:{}", throwable);}});CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> runTask("result2", 1500), executorService).whenComplete((result, throwable) ->{if (result != null) {resultList.add(result);}if (throwable != null) {logger.error("completableFuture2 error:{}", throwable);}});List<CompletableFuture<String>> futureList = new ArrayList<>();futureList.add(completableFuture1);futureList.add(completableFuture2);try {//多个任务CompletableFuture[] futureArray = futureList.toArray(new CompletableFuture[0]);//将多个任务,汇总成一个任务,总共耗时不超时2秒CompletableFuture.allOf(futureArray).get(2, TimeUnit.SECONDS);} catch (Exception e) {logger.error("CompletableFuture.allOf Exception error.", e);}List<String> list = new ArrayList<>(resultList);list.forEach(System.out::println);}private static String runTask(String result, int millis) {try {//此处忽略实际的逻辑,用sleep代替//任务耗时。可以分别设置1000和3000,看未超时和超时的不同结果。Thread.sleep(millis);} catch (InterruptedException e) {logger.error("supplyAsyncGet error.");}return result;}
相关资料:
https://blog.csdn.net/sinat_32502451/article/details/132819472
相关文章:
CompletableFuture多任务异步,获取返回值,汇总结果
线程池异步的基础知识 详情见:https://blog.csdn.net/sinat_32502451/article/details/133039624 线程池执行多任务,获取返回值 线程池的 submit()方法,可以提交任务,并返回 Future接口。 而 future.get(),可以获取…...
Linux上Qt和Opencv人脸识别项目学习路线(嵌入式/C++)
本文将介绍Linux人脸识别项目的开发流程, 只作简略介绍所需知识点及大致流程。 注:若需详细教程请联系作者(见文末)。 一、基本开发环境搭建 1.1 安装虚拟机Ubuntu 虚拟机采用的是VMware,需要下载VMware安装包、ubuntu系统镜像…...
spring 源码阅读之@Configuration解析
Configuration解析 Configuration注解用于标识一个类是配置类,用于声明和组织Bean定义,首先Configuration本身也是一个Component,在其注解定义上标有Component Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Co…...
Java Web 33道面试题汇总
更多面试合集在:https://javaxiaobear.cn 1、http 的长连接和短连接? HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名…...
设计模式记录
设计模式 抽象工厂模式单例模式要实现一个单例,需要关注的点有下面几个: 抽象工厂模式 PHP工厂模式是一种可扩展、可维护和可重复使用的方法,旨在提供通用接口,用于创建对象。工厂模式的主要组成部分包括抽象工厂、具体工厂、抽象产品和具体产…...
Java设计模式之亨元模式(Flyweight Pattern)
亨元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和提高性能。该模式适用于需要创建大量相似对象的情况,其中许多对象具有相同的状态。通过共享相同的状态,亨元模式可以减少…...
正点原子嵌入式linux驱动开发——Linux中断
不管是单片机裸机实验还是Linux下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断需要做一大堆的工作,比如配置寄存器,使能IRQ等等。但是Linux内核提供了完善的中断框架,只需要申请中断,然后注册中断处…...
基于Jaya优化算法的电力系统最优潮流研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Write-Ahead Log(PostgreSQL 14 Internals翻译版)
日志 如果发生停电、操作系统错误或数据库服务器崩溃等故障,RAM中的所有内容都将丢失;只有写入磁盘的数据才会被保留。要在故障后启动服务器,必须恢复数据一致性。如果磁盘本身已损坏,则必须通过备份恢复来解决相同的问题。 理论…...
CUDA 学习记录
1.关于volatile: 对于文章中这个函数, __global__ void reduceUnrollWarps8 (int *g_idata, int *g_odata, unsigned int n) {// set thread IDunsigned int tid threadIdx.x;unsigned int idx blockIdx.x * blockDim.x * 8 threadIdx.x;// convert…...
【Java 进阶篇】深入了解 Bootstrap 按钮和图标
按钮和图标在网页设计中扮演着重要的角色,它们是用户与网站或应用程序交互的关键元素之一。Bootstrap 是一个流行的前端框架,提供了丰富的按钮样式和图标库,使开发者能够轻松创建吸引人的界面。在本文中,我们将深入探讨 Bootstrap…...
基于Java的人事管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...
代码随想录算法训练营第五十九天| 647. 回文子串 516.最长回文子序列
今日学习的文章链接和视频链接 回文子串 https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html 516.最长回文子序列 https://programmercarl.com/0516.%E6%9C%80%E9%95%BF%E5%9B%9E%E6%96%87%E5%AD%90%E5%BA%8F%E5%88%97.html 动态规划总结篇 https:…...
uniapp 小程序优惠劵样式
先看效果图 上代码 <view class"coupon"><view class"tickets" v-for"(item,index) in 10" :key"item"><view class"l-tickets"><view class"name">10元优惠劵</view><view cl…...
元梦之星内测上线,如何在B站打响声量?
元梦之星是腾讯天美工作室群研发的超开星乐园派对手游,于2023年1月17日通过审批。该游戏风格可爱软萌,带有社交属性,又是一款开黑聚会的手游,备受年轻人关注。 飞瓜数据(B站版)显示,元梦之星在…...
Python---循环---while循环
Python中的循环 包括 while循环与for循环,本文以while循环为主。 Python中所有的知识点,都是为了解决某个问题诞生的,就好比中文的汉字,每个汉字都是为了解决某种意思表达而诞生的。 1、什么是循环 现实生活中,也有…...
面试知识点--基础篇
文章目录 前言一、排序1. 冒泡排序2. 选择排序3. 插入排序4. 快速单边循环排序5. 快速双边循环排序6. 二分查找 二、集合1.List2.Map 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、排序 1. 冒泡排序 冒泡排序就是把小的元素往前调或者把大…...
FIFO设计16*8,verilog,源码和视频
名称:FIFO设计16*8,数据显示在数码管 软件:Quartus 语言:Verilog 代码功能: 使用verilog语言设计一个16*8的FIFO,深度16,宽度为8。可对FIFO进行写和读,并将FIFO读出的数据显示到…...
#力扣:2769. 找出最大的可达成数字@FDDLC
2769. 找出最大的可达成数字 - 力扣(LeetCode) 一、Java class Solution {public int theMaximumAchievableX(int num, int t) {return num 2*t;} }...
Juniper防火墙SSG-140 session 过高问题
1.SSG-140性能参数 2.问题截图 3.解决方法 (1)通过telnet 或 consol的方法登录到防火墙; (2)使用get session 查看总的session会话数,如果大于300 一般属于不正常情况 (3)使用get…...
GLIGEN核心架构解析:深入理解接地令牌化器的设计原理
GLIGEN核心架构解析:深入理解接地令牌化器的设计原理 【免费下载链接】GLIGEN Open-Set Grounded Text-to-Image Generation 项目地址: https://gitcode.com/gh_mirrors/gl/GLIGEN GLIGEN作为开源的Open-Set Grounded Text-to-Image Generation项目ÿ…...
fpga系列 HDL : Microchip FPGA开发软件 Libero Soc选择RAM IP(Two Port IP核)
Catalog下选择ram IP 特性RAM - Dual PortRAM - Two Port别名通常指 True Dual-Port RAM通常指 Simple Dual-Port RAM端口功能两个端口均可读可写 (R/W)端口功能分离:一个端口只写,另一个端口只读端口定义端口A和端口B是对等的,都可以独立进行…...
2026届学术党必备的六大AI辅助写作网站实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 大规模语言模型的核心创新,在DeepSeek系列论文中得到了系统阐述。当中的其一&…...
PlainUSR:轻量实时图像超分(RepMBCConv + LIA + PlainU-Net)
文章目录PlainUSR:轻量实时图像超分(RepMBCConv LIA PlainU-Net)一、架构二、环境三、数据 (DIV2K)四、模型4.1 RepMBCConv (重参数化轻量卷积)4.2 LIA (局部重要性注意力)4.3 PlainU-Net PlainUSR五、训练训练曲线六、推理 重参数化七、…...
天力监控看板:大宗材料与汇率波动的智慧管家
在复杂多变的市场环境中,大宗材料价格及汇率的波动直接影响着企业的成本控制和盈利能力。为了更好地应对这些挑战,JBoltAI团队为天力定制开发了一款大宗材料及汇率波动监控看板,为企业提供全面、实时、可追溯的数据监控与分析工具。一、总览看…...
py每日spider案例之长jiang大学登录接口(AES)
CryptoJS=require("crypto-js");var $aes_chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678", aes_chars_len = $aes_chars.length; function randomString...
SSCom串口调试助手:Linux和macOS下的高效串口通信终极指南
SSCom串口调试助手:Linux和macOS下的高效串口通信终极指南 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom SSCom是一款专为Linux和macOS系统设计的免费串口调试工具,它为嵌入式开发者、物…...
时间序列预测模型选型:构建高效决策矩阵
1. 时间序列预测模型决策矩阵概述在数据分析领域,时间序列预测一直是个既基础又复杂的课题。我见过太多团队在模型选型上反复折腾——从简单的移动平均到复杂的LSTM神经网络,每个项目都要重新走一遍试错的老路。这种低效的决策过程促使我开发了一套系统化…...
Claude代码插件与技能项目:AI编程助手集成开发环境实战指南
1. 项目概述与核心价值最近在开发者社区里,一个名为jeremylongshore/claude-code-plugins-plus-skills的项目引起了我的注意。乍一看标题,它似乎是一个围绕 Claude(Anthropic 公司开发的大型语言模型)的代码插件和技能增强包。但深…...
【Linux从入门到精通】第22篇:Shell变量与数据类型——数字与字符串处理
目录 一、引言:变量不只是“存个值” 二、环境变量 vs 局部变量:作用域的秘密 2.1 用实验理解差别 2.2 什么时候用哪种? 2.3 查看当前所有环境变量 2.4 持久化环境变量 三、只读变量与常量保护 3.1 readonly:让变量变成“常…...
