当前位置: 首页 > news >正文

尝试一下Guava带返回值的多线程处理类ListenableFuture

文章目录

    • ListenableFuture,带返回值的Guava多线程处理工具类
    • 举个例子
    • 扩展阅读

最近在学习,Java实现异步编程的8种方式这篇博客的时候,没有找到比较好的一个学习demo,故在此整理一下。

ListenableFuture,带返回值的Guava多线程处理工具类

ListenableFuture是Java中的一个接口,它继承自java.util.concurrent.Future接口。ListenableFuture主要用于异步计算场景,允许在计算完成后添加回调函数(Callback),从而实现对异步任务执行结果的监听和处理。

与普通的Future不同,ListenableFuture提供了一种更加灵活且易于使用的方式来处理并发操作。当你提交一个任务到ExecutorService时,会返回一个ListenableFuture对象。这个对象表示将来某个时间点上可用的结果,并允许你在该结果可用时触发回调函数。

为了实现这一功能,ListenableFuture提供了两个关键方法:

  1. addListener(Runnable listener, Executor executor):此方法允许用户向ListenableFuture注册一个Runnable类型的监听器,在异步任务完成时由指定的executor执行。
  2. addCallback(FutureCallback<? super V> callback, Executor executor):此方法允许用户向ListenableFuture注册一个带有成功和失败处理逻辑的回调函数,在异步任务完成或出错时由指定的executor执行。

Google Guava库提供了对ListenableFutures进行操作、转换和组合等高级功能支持。例如:

  • Futures.transform():基于原始 ListenableFuture 的值创建新 ListenableFutures。
  • Futures.allAsList() 和 Futures.successfulAsList():将多个 ListenableFutures 组合成单个 Future。
  • Futures.immediate* 系列方法:创建已经具备特定值或异常状态下立即完成的 ListenableFutures。

总之,ListenableFuture提供了一种更加灵活、高效且易于使用的方式来处理并发操作和异步任务。它允许开发者在计算完成后添加回调函数,从而实现对异步任务执行结果的监听和处理。

举个例子

下面是一个使用ListenableFuture的示例,其中在for循环中提交了多个任务:

import com.google.common.util.concurrent.*;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;public class ListenableFutureDemo {public static void main(String[] args) {// 创建一个线程池ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));// 用于存储所有的ListenableFuture对象List<ListenableFuture<String>> futures = new ArrayList<>();for (int i = 0; i < 10; i++) {final int taskId = i;Callable<String> task = () -> {Thread.sleep(1000); // 模拟耗时操作return "Task " + taskId + " completed";};ListenableFuture<String> future = executorService.submit(task);Futures.addCallback(future, new FutureCallback<>() {@Overridepublic void onSuccess(String result) {System.out.println("Success: " + result);}@Overridepublic void onFailure(Throwable t) {System.err.println("Error occurred while executing task " + taskId);t.printStackTrace();}}, MoreExecutors.directExecutor());futures.add(future);}try {// 等待所有任务完成,并获取结果。List<String> results = Futures.allAsList(futures).get();System.out.println("All tasks completed successfully. Results: ");results.forEach(System.out::println);executorService.shutdown(); // 关闭线程池} catch (Exception e) {e.printStackTrace();}}
}

这个示例首先创建了一个ListeningExecutorService实例。然后,在for循环中创建并提交了10个Callable任务。每次迭代都会将新创建的ListenableFuture添加到futures列表中。

我们还为每个future添加了回调函数,以便在任务成功或失败时执行相应的操作。最后,我们等待所有future完成,并输出它们的结果。

扩展阅读

Java实现异步编程的8种方式

相关文章:

尝试一下Guava带返回值的多线程处理类ListenableFuture

文章目录 ListenableFuture&#xff0c;带返回值的Guava多线程处理工具类举个例子扩展阅读 最近在学习&#xff0c;Java实现异步编程的8种方式这篇博客的时候&#xff0c;没有找到比较好的一个学习demo&#xff0c;故在此整理一下。 ListenableFuture&#xff0c;带返回值的Gua…...

微信小程序真机调试报ERR_CERT_AUTHORITY_INVALID

微信小程序真机调试报ERR_CERT_AUTHORITY_INVALID 问题解决方法 问题 微信开发者工具中调试微信小程序&#xff0c;在开发工具里面调试没问题&#xff0c;但是真机调试的时候报ERR_CERT_AUTHORITY_INVALID错误 解决方法 到这个站点检查域名的Https证书的安全性 : 传送门(注:…...

JCommander + AutoService打造带子命令的Java命令行应用

文章目录 需求Java命令行工具库依赖库定义各个子命令主类CLI测试一下参考文档 需求 最近想将自己的一个Java应用包装成命令行工具&#xff0c;看了几个库&#xff0c;最后选取了JCommander&#xff0c;结合AutoService库&#xff0c;实现了带子命令的工具&#xff0c;方便扩展…...

pycharm运行pytest无法实时输出信息

需要去掉控制台输出。根据查询相关信息显示pycharm运行pytest无法实时输出信息&#xff0c;需要去掉pycharm里面的运行模式&#xff0c;点击减号&#xff0c;再点击加号&#xff0c;添加python执行文件即可实时输出信息。 问题描述&#xff1a; 使用pycharm运行代码时&#x…...

Mac 卸载 IntelliJ IDEA 方法

Mac 系统下 IDEA 没有一键卸载程序&#xff0c;也没有完全卸载的插件&#xff0c;若要彻底删除&#xff0c;除了在应用&#xff08;Application&#xff09;里删除 IDEA 到垃圾桶外&#xff0c;还需要在终端&#xff08;Terminal&#xff09;执行删除相应的文件及文件夹。 1 分…...

数据安全能力框架模型-详细解读(三)

数据安全能力框架内涵 “奇安信数据安全能力框架”体现了数据安全治理从组织机构安全治理&#xff0c;到数字化环境具体管控、分析能力分层逐步落实的工程方法。 它以企业数据安全的战略目标和风险容忍度为输入&#xff0c;明确数据安全治理的组织&#xff1b;以合规与治理需…...

vscode启动leiningen项目

要在 VS Code 中启动 Leiningen 项目&#xff0c;你可以按照以下步骤进行操作&#xff1a; 确保已经安装了 Leiningen。你可以在终端中输入 lein version 来检查是否已成功安装。 在 VS Code 中安装 Leiningen 扩展。打开 VS Code&#xff0c;点击左侧的扩展图标&#xff08;四…...

Qt事件的传递顺序

事件的传递顺序 事件的传递顺序是这样的&#xff1a;先是事件过滤器&#xff0c;然后是该部件的event()函数&#xff0c;最后是该部件的事件处理函数。这里还要注意&#xff0c;event()函数和事件处理函数&#xff0c;是在该部件内进行重新定义的&#xff0c;而事件过滤器却是…...

基于facenet+faiss开发构建人脸识别系统

facenet是一款非常经典的神经网络模型&#xff0c;它可以直接学习从人脸图像到欧几里德空间的映射(直接将人脸映射到欧几里得空间)。在欧几里德空间中&#xff0c;距离直接对应于人脸相似性的度量。一旦这个空间产生&#xff0c;使用标准技术&#xff0c;将FaceNet嵌入作为特征…...

数据分析的心脏:获取数据的好工具

打开网站&#xff1a;Scrape and Monitor Data from Any Website with No Code 新建机器人&#xff1a; 选择类型&#xff1a; 填写目标网站网址&#xff1a; 输入网址&#xff1a;https://cn.wsj.com/zh-hans/news/technology 第一次录制需要安装chrome插件&#xff1a; 并设置…...

【万字长文】SpringBoot整合Atomikos实现多数据源分布式事务(提供Gitee源码)

前言&#xff1a;在最近的实际开发的过程中&#xff0c;遇到了在多数据源的情况下要保证原子性的问题&#xff0c;这个问题当时遇到了也是思考了一段时间&#xff0c;后来通过搜集大量资料与学习&#xff0c;最后是采用了分布式事务来解决这个问题&#xff0c;在讲解之前&#…...

js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?

目录 目录 目录 参考资料 必看强烈建议十分钟看完视频 &#xff0c;即可学会 必看参考详解宏任务微任务 参考资料 1 宏任务与微任务_哔哩哔哩_bilibili 什么是宏任务、微任务&#xff1f;宏任务、微任务有哪些&#xff1f;又是怎么执行的&#xff1f;_什么是宏任务和微任…...

Word中如何断开表格中线段

Word中如何断开表格中线段_word表格断线怎么弄_仰望星空_LiDAR的博客-CSDN博客有时候为了美观&#xff0c;需要实现如下的效果&#xff0c;即第2条线段被断开成3段步骤如下&#xff1a;选中需要断开的格网&#xff0c;如下&#xff0c;再选择段落、针对下框标即可。_word表格断…...

大数据指标体系-笔记

指标体系 1 总体流程图 1.1 2 模型‘ 2.1 OSM OSM(Object,Strategy,Measure) 「业务度量」涉及到以下两个概念:一个是KPI ,用来直 接衡量策略的有效性;一个是Target,是预先给出的值,用来判断是否达到预期 2.2 UJM User, Journey, Map 2.3 AARRR-海盗 AARRR(Acquisitio…...

Arthas协助MQ消费性能优化

背景 项目中使用AWS的SQS消息队列进行异步处理&#xff0c;QA通过压测发现单机TPS在23左右&#xff0c;目标性能在500TPS&#xff0c;所以需要对消费逻辑进行优化&#xff0c;提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈&#xff…...

【Linux】【docker】安装sonarQube免费社区版9.9

文章目录 ⛺sonarQube 镜像容器⛺Linux 安装镜像&#x1f341;出现 Permission denied的异常&#x1f341;安装sonarQube 中文包&#x1f341;重启服务 ⛺代码上传到sonarQube扫描&#x1f341;java语言配置&#x1f341;配置 JS TS Php Go Python⛏️出现异常sonar-scanner.ba…...

C/C++实现librosa音频处理库melspectrogram和mfcc

C/C实现librosa音频处理库melspectrogram和mfcc 目录 C/C实现librosa音频处理库melspectrogram和mfcc 1.项目结构 2.依赖环境 3.C librosa音频处理库实现 (1) 对齐读取音频文件 (2) 对齐melspectrogram (3) 对齐MFCC 4.Demo运行 5.librosa库C源码下载 深度学习语音处…...

浪潮服务器硬盘指示灯显示黄色的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 宁夏某市某单位的一台浪潮服务器&#xff0c;该服务器中有一组由6块SAS硬盘组建的RAID5阵列。 服务器上存放的是Oracle数据库文件&#xff0c;操作系统层面划分了1个卷。 服务器故障&初检&#xff1a; 服务器在运行过程中有两块磁盘的指示灯…...

宋浩概率论笔记(三)随机向量/二维随机变量

第三更&#xff1a;本章的内容最重要的在于概念的理解与抽象&#xff0c;二重积分通常情况下不会考得很难。此外&#xff0c;本次暂且忽略【二维连续型随机变量函数的分布】这一章节&#xff0c;非常抽象且难度较高&#xff0c;之后有时间再更新。...

附件展示 点击下载

效果图 实现代码 <el-table-column prop"attachment" label"合同附件" width"250" show-overflow-tooltip><template slot-scope"scope"><div v-if"scope.row.cceedcAppendixInfoList &&scope.row.ccee…...

Vivado里给UltraScale FPGA的MGT分时钟,为啥隔壁SLR的Bank死活不认?

Vivado调试手记&#xff1a;破解UltraScale FPGA跨SLR时钟共享难题 第一次在Vivado里看到"ERROR: [DRC 23-20] GT_COMMON placement violation"这个红色报错时&#xff0c;我盯着屏幕愣了三分钟——明明在7系列FPGA上运行良好的参考时钟共享方案&#xff0c;怎么换到…...

高光谱成像基础(十一)异常检测算法 RX 与 KRX胸

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) {private readonly SqlSource _source new(builder.DataSource);private readonly IParamQuery _accountQuery build…...

OpenClaw+千问3.5-35B-A3B-FP8:自动化财务报表生成与分析

OpenClaw千问3.5-35B-A3B-FP8&#xff1a;自动化财务报表生成与分析 1. 为什么需要自动化财务处理 每个月末&#xff0c;我都会面对同样的烦恼&#xff1a;银行流水、电子发票、Excel表格散落在不同平台&#xff0c;手动整理耗时费力。直到发现OpenClaw与千问3.5模型的组合&a…...

实战指南:SpringBoot与KingbaseES的高效集成与性能调优

1. SpringBoot与KingbaseES集成基础 第一次接触KingbaseES时&#xff0c;我完全被它的兼容性震惊了。这个国产数据库不仅能完美支持标准SQL&#xff0c;还能无缝对接Oracle、MySQL等语法体系。记得当时接手一个老项目迁移&#xff0c;原本担心要重写大量SQL&#xff0c;结果90%…...

嵌入式飞控信号滤波:SMA/EMA/互补滤波与卡尔曼简化实现

1. NexgenFilter 库概述&#xff1a;面向嵌入式飞行控制的轻量级信号处理工具集NexgenFilter 是专为 Nexgen Magpie 无人机飞控系统设计的一套高性能、低开销数字滤波与噪声生成库。它并非通用 DSP 库&#xff0c;而是深度嵌入在实时性严苛、资源受限的 MCU&#xff08;如 STM3…...

STM32 RTC掉电也能走时?手把手教你用VBAT和LSE晶振搭建硬件时钟电路

STM32 RTC掉电也能走时&#xff1f;手把手教你用VBAT和LSE晶振搭建硬件时钟电路 嵌入式系统中实时时钟&#xff08;RTC&#xff09;的重要性不言而喻&#xff0c;它不仅是记录时间的工具&#xff0c;更是许多关键功能的基石。想象一下&#xff0c;当你的智能门锁因为断电而无法…...

景区气象站是什么

景区气象站监测项目包含负氧离子、pm2.5、pm10、温度、湿度、气压、含氧量、噪音、风速、风向等&#xff0c;是一款用于林业、景区、公园、环保、气象、农业等领域的实时环境气象监测与发布的监测系统&#xff0c;主要针对景区、湿度公园空气质量环境进行集中监控和管理&#x…...

河道水质在线监测系统

河道水质监测系统&#xff0c;以“立杆式微型站太阳能供电”为核心设计&#xff0c;主打“无需基建、便捷部署、精准监测”&#xff0c;彻底打破传统监测模式的局限。系统主要由基础支架&#xff08;含立杆、地笼、ABS防腐耐蚀防护箱&#xff09;、供电系统、监控主机、水质传感…...

HsMod:革新性炉石传说增强工具,全方位提升游戏体验

HsMod&#xff1a;革新性炉石传说增强工具&#xff0c;全方位提升游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 一、你是否也面临这些游戏痛点&#xff1f; 当你兴致勃勃地开启…...

如何让AirPods在Windows/Linux焕发新生:AirPodsDesktop的跨平台解放方案

如何让AirPods在Windows/Linux焕发新生&#xff1a;AirPodsDesktop的跨平台解放方案 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop…...