如何利用 Guava 的 ListenableFuture 扩展原生 Future 以实现具有监听回调能力的异步任务处理

云浩同学_5595

云浩同学_5595

2026-04-24

358人浏览

原创

ListenableFuture 通过继承 Future 并新增监听能力实现异步升级,必须由 ListeningExecutorService 创建;推荐用 Futures.addCallback 注册回调并指定执行器,支持 transform/ catching 链式处理;新项目应优先选用 CompletableFuture。

如何利用 guava 的 listenablefuture 扩展原生 future 以实现具有监听回调能力的异步任务处理

Guava 的 ListenableFuture 并不是对原生 Future 的“包装扩展”,而是通过接口继承(extends Future)+ 新增能力的方式,在语义和使用模式上实现质的升级:它让异步任务真正可“监听”,不再依赖轮询或阻塞 get()。

必须用 ListeningExecutorService 创建

原生 Future 由 ExecutorService.submit() 返回,而 ListenableFuture 只能由 ListeningExecutorService 创建——这是硬性前提,不能靠转换或装饰已有 Future。

  • 用 MoreExecutors.listeningDecorator(executor) 包装你已有的线程池(如 ThreadPoolExecutor)
  • 调用该装饰器的 submit() 或 invokeAll() 方法,返回值才是真正的 ListenableFuture
  • 直接 new ListenableFutureTask 也可行,但需手动管理生命周期,不推荐在业务中使用

注册回调要明确执行线程

监听器的执行上下文不由任务线程决定,而是由你传入的 Executor 控制——这点极易出错,尤其在 UI 或 Web 主线程场景中。

Recraft AI
Recraft AI

Recraft AI是一款AI 3D生成工具,免费无限AI画板,生成高质量矢量艺术画、图标、3D图片和插画。

下载
  • 用 Futures.addCallback(future, callback, executor) 是最清晰的方式:callback 实现 onSuccess/onFailure,executor 指定回调在哪跑
  • 若想切回主线程(如 Android 或 Swing),传 ContextCompat.getMainExecutor(context) 或 SwingUtilities.invokeLater 封装的 executor
  • 避免滥用 MoreExecutors.directExecutor():它把回调压进当前线程(可能是 IO 线程或 Tomcat 工作线程),一旦回调耗时,会阻塞整个线程池

构建异步流水线:transform 和 catching

比起单纯监听完成事件,ListenableFuture 更强的是支持链式异步处理,类似 CompletableFuture 的 thenApply 和 exceptionally。

  • Futures.transform(input, function, executor):对成功结果做同步转换,返回新 ListenableFuture;若需异步转换(比如再发一次 HTTP 请求),用 AsyncFunction 版本
  • Futures.catching(input, exceptionClass, fallback, executor):只捕获指定类型异常(如 IOException),返回默认值或重试 future;其他异常仍向上抛
  • 每层 transform 或 catching 都生成新 future,逻辑清晰,但嵌套过深可能增加调度开销(一般可忽略)

注意兼容性与演进趋势

ListenableFuture 是 JDK 8 之前最成熟的回调方案,但它正逐步被官方收编和替代。

  • 如果你项目仍在用 JDK 7、Spring 4.x 或 Dubbo 2.6,ListenableFuture 是稳妥选择——这些老框架不认 CompletableFuture 作为 RPC 返回类型
  • Guava 28+ 已将 ListenableFuture 标记为 @Beta,新项目应优先选用 CompletableFuture,它原生支持函数式链式调用、更丰富的组合操作,且无需额外依赖
  • 迁移成本不高:多数 Futures.addCallback 场景可直接转为 whenComplete 或 handle,transform 对应 thenApply,catching 对应 exceptionally 或 handle

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

12137

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

9222

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7872

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1284

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1028

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1536

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3169

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20431

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1395

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Swoole手册
Swoole手册

共0课时 | 0人学习