讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中如何用CompletableFuture组合异步操作

轻萱酱_3005

轻萱酱_3005

发布时间:2025-06-23 22:20:02

|

579人浏览过

|

来源于php中文网

原创

completablefuture的常用组合方法包括thencombine、thencompose、allof、thenapply、thenaccept、anyof和ortimeout。其中thencombine用于合并两个独立future的结果,thencompose用于将一个future的结果作为另一个future的输入,allof用于等待多个future完成,thenapply允许对一个future的结果进行转换,thenaccept允许对结果执行操作但不返回值,anyof允许等待多个future中的任何一个完成,ortimeout用于设置超时时间。此外,处理异常的方法包括exceptionally提供默认值或恢复逻辑,handle用于同时处理正常结果和异常情况,并且相较于传统future,completablefuture具有非阻塞性、丰富的组合能力、异常处理机制及支持超时控制等优势,显著提升了异步编程的灵活性和健壮性。

Java中如何用CompletableFuture组合异步操作

使用CompletableFuture组合异步操作,核心在于将多个独立的异步任务串联或并行执行,最终得到一个整合的结果。这能显著提升程序的并发性和响应速度,尤其是在处理I/O密集型任务时。

Java中如何用CompletableFuture组合异步操作
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return "Error in Future 1";
            }
            return "Result from Future 1";
        });

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            // 模拟另一个耗时操作
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return "Error in Future 2";
            }
            return "Result from Future 2";
        });

        // 使用 thenCombine 组合两个 Future 的结果
        CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> {
            return result1 + " and " + result2;
        });

        // 获取组合后的结果
        String finalResult = combinedFuture.get();
        System.out.println("Combined Result: " + finalResult);

        // 使用 thenCompose 链接 Future
        CompletableFuture<String> composedFuture = future1.thenCompose(result1 -> {
            return CompletableFuture.supplyAsync(() -> {
                return result1 + " processed further";
            });
        });

        String composedResult = composedFuture.get();
        System.out.println("Composed Result: " + composedResult);

        // 使用 allOf 等待所有 Future 完成
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);

        allFutures.get(); // 等待所有 future 完成
        System.out.println("All futures completed");

        // 处理异常
        CompletableFuture<String> futureWithError = CompletableFuture.supplyAsync(() -> {
            throw new RuntimeException("Simulated error");
        }).exceptionally(ex -> {
            System.err.println("Caught exception: " + ex.getMessage());
            return "Recovered from error";
        });

        String errorResult = futureWithError.get();
        System.out.println("Error Result: " + errorResult);
    }
}

CompletableFuture的核心在于它提供了一系列方法来组合、链接和处理异步操作的结果。 thenCombine 用于合并两个独立Future的结果, thenCompose 用于将一个Future的结果作为另一个Future的输入, allOf 用于等待多个Future完成,而 exceptionally 用于处理异常情况。

Java中如何用CompletableFuture组合异步操作

CompletableFuture有哪些常用的组合方法?

立即学习“Java免费学习笔记(深入)”;

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
Java中如何用CompletableFuture组合异步操作

除了上面提到的 thenCombine、 thenCompose 和 allOf,还有一些其他常用的组合方法。 例如, thenApply 允许你对一个Future的结果进行转换,而 thenAccept 允许你对结果执行一些操作,但不返回任何值。 anyOf 允许你等待多个Future中的任何一个完成。 orTimeout 允许你设置超时时间,如果Future在指定时间内未完成,则会抛出异常。

如何处理CompletableFuture中的异常?

处理 CompletableFuture 中的异常至关重要,否则未捕获的异常可能会导致程序崩溃或产生不可预测的行为。 除了 exceptionally 方法,还可以使用 handle 方法来同时处理正常结果和异常情况。 exceptionally 提供了一种简单的方式来提供一个默认值或执行一些恢复操作,而 handle 提供了更大的灵活性,允许你根据结果或异常来执行不同的逻辑。 另外,需要注意的是,如果Future抛出了受检异常,则需要在调用 get() 方法时捕获 ExecutionException 和 InterruptedException。

CompletableFuture与传统的Future相比有什么优势?

CompletableFuture 相较于传统的 Future 接口,最大的优势在于其非阻塞性和组合性。 传统的 Future 接口在调用 get() 方法时会阻塞当前线程,直到结果可用为止。 而 CompletableFuture 允许你注册回调函数,在结果可用时自动执行,而无需阻塞。 此外,CompletableFuture 提供了丰富的组合方法,可以轻松地将多个异步操作链接在一起,而传统的 Future 接口则缺乏这种灵活性。 CompletableFuture 还支持异常处理和超时控制,使得异步编程更加健壮和易于管理。 另一个关键区别在于 CompletableFuture 实现了 CompletionStage 接口,这使得它可以与其他异步组件(如 Reactive Streams)无缝集成。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5049

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4398

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn