学习理解 CompletableFuture

news2024/11/24 13:08:27

学习理解 CompletableFuture

CompletableFuture 是 Java 8 引入的一个强大的工具,它使得编写异步和并行代码变得更加容易。
CompletableFuturejava.util.concurrent 包的一部分,是 Future 的扩展,它不仅允许你手动完成计算,还提供了一套丰富的 API 来支持异步编程。与传统的 Future 不同,CompletableFuture 提供了非阻塞的方式来获取结果,并且可以链式调用和组合多个异步任务。

Future 对比

上一篇文章详细介绍了Future类,请看 学习Java中的Future类: https://blog.csdn.net/kaka_buka/article/details/139663543

FutureCompletableFuture 都是 Java 中用于表示异步计算结果的接口,但它们之间有一些重要的区别:

  1. 获取结果

    • Future:需要调用 get() 方法来阻塞当前线程,直到计算完成。
    • CompletableFuture:提供了非阻塞的 thenApply, thenAccept 等方法来处理结果,允许在任务完成后自动执行回调。
  2. 组合任务

    • Future:没有直接支持任务组合的机制,需要手动管理多个 Future
    • CompletableFuture:提供了丰富的方法来组合多个异步任务,例如 thenCompose, thenCombine, allOf, anyOf 等。
  3. 异常处理

    • Future:没有直接支持异常处理,需要在 get() 方法调用时捕获异常。
    • CompletableFuture:提供了 exceptionally, handle 等方法来处理异步任务中的异常。

通过以上对比可以看出,CompletableFuture 在异步编程中的灵活性和功能性远远超过了传统的 Future

创建 CompletableFuture

1. 使用静态方法创建

CompletableFuture 提供了几种静态方法来创建其实例:

  • CompletableFuture.supplyAsync(Supplier<U> supplier):异步地执行一个返回值的任务。
  • CompletableFuture.runAsync(Runnable runnable):异步地执行一个不返回值的任务。
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
    // 异步任务,不返回结果
    System.out.println("Running in a separate thread");
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    // 异步任务,返回结果
    return "Hello, CompletableFuture!";
});

2. 手动完成 CompletableFuture

你也可以创建一个空的 CompletableFuture 实例,并在未来的某个时间点手动完成它:

CompletableFuture<String> future = new CompletableFuture<>();
// 在某个时刻手动完成
future.complete("Manual completion");

常用方法

CompletableFuture 提供了丰富的方法来处理异步任务,下面介绍几种常用的方法:

1. thenApply

thenApply 方法用于在前一个任务完成后,对结果进行转换:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(result -> result + " World");

2. thenAccept

thenAccept 方法用于在前一个任务完成后,处理结果但不返回新的结果:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenAccept(result -> System.out.println("Result: " + result));

3. thenRun

thenRun 方法用于在前一个任务完成后,执行一个新的任务,但不依赖于前一个任务的结果:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenRun(() -> System.out.println("Task completed"));

4. handle

handle 方法用于处理任务的结果或异常:

CompletableFuture.supplyAsync(() -> {
    if (new Random().nextBoolean()) {
        throw new RuntimeException("Failed");
    }
    return "Success";
}).handle((result, ex) -> {
    if (ex != null) {
        return "Error: " + ex.getMessage();
    }
    return result;
});

组合多个 CompletableFuture

CompletableFuture 允许你组合多个异步任务,以下是几种常见的组合方式:

1. thenCompose

thenCompose 用于将多个异步任务进行平铺,使其顺序执行:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenCompose(result -> CompletableFuture.supplyAsync(() -> result + " World"));

2. thenCombine

thenCombine 用于将两个并行执行的异步任务的结果合并:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);

3. allOf

allOf 用于等待所有给定的 CompletableFuture 都完成:

CompletableFuture<Void> allOfFutures = CompletableFuture.allOf(future1, future2);
allOfFutures.thenRun(() -> System.out.println("All tasks completed"));

4. anyOf

anyOf 用于等待任意一个给定的 CompletableFuture 完成:

CompletableFuture<Object> anyOfFutures = CompletableFuture.anyOf(future1, future2);
anyOfFutures.thenAccept(result -> System.out.println("First completed task result: " + result));

异常处理

在使用 CompletableFuture 时,处理异常是至关重要的。CompletableFuture 提供了几种方法来处理异步任务中的异常:

exceptionally

exceptionally 方法用于在计算过程中发生异常时提供一个默认值:

CompletableFuture.supplyAsync(() -> {
    if (new Random().nextBoolean()) {
        throw new RuntimeException("Failed");
    }
    return "Success";
}).exceptionally(ex -> "Error: " + ex.getMessage());

handle

前面提到的 handle 方法也可以用于处理异常,同时还可以处理正常的结果:

CompletableFuture.supplyAsync(() -> {
    if (new Random().nextBoolean()) {
        throw new RuntimeException("Failed");
    }
    return "Success";
}).handle((result, ex) -> {
    if (ex != null) {
        return "Error: " + ex.getMessage();
    }
    return result;
});

结论

CompletableFuture 为 Java 异步编程提供了强大的支持,它不仅简化了异步任务的编写,还提供了丰富的 API 来组合多个任务和处理异常。在现代 Java 应用中,CompletableFuture 是一个不可或缺的工具。

参考链接

  • CompletableFuture 官方文档
  • Java 并发编程教程
  • Java 8 Concurrency Tutorial: Threads and Executors

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

锂电池航空运输报告办理 UN38.3电池报告

锂电池航空运输报告办理 锂电池航空运输报告&#xff0c;通常指的是UN38.3测试报告&#xff0c;这是联合国针对危险品运输制定的《联合国危险物品运输试验和标准手册》的第3部分38.3款的要求。UN38.3测试报告证明锂电池在运输过程中的安全性&#xff0c;包括高度模拟、高低温循…

Liquibase(Oracle SQLcl集成版)简明示例

本文使用的是Oracle SQLcl中集成的Liquibase&#xff0c;而非开源版Liquibase。 Liquibase的快速入门可以参见Liquibase Core Concepts。需要了解一下概念&#xff1a; Change log&#xff1a;基于文本的更改日志文件按顺序列出对数据库所做的所有更改Change set&#xff1a;…

Python学习之旅:你的大学计算机专业宝藏路线图

在信息时代的浪潮中&#xff0c;Python以其强大的功能和极简的语法成为了无数程序员心中的白月光。作为大学计算机专业的学生&#xff0c;掌握Python不仅能够为未来的职业生涯铺路&#xff0c;更能让您在学术研究和实际应用中如鱼得水。今天&#xff0c;我将与大家分享一套实用…

Vue3-滑动到最右验证功能

1、思路 1、在登录页面需要启动向右滑块验证 2、效果图 3、文章地址&#xff1a;滑动验证码的实现-vue-simple-verify 2、成分分析 1、由三块构成&#xff0c;分别是底部条、拖动条、拖动移动部分 2、底部条&#xff1a;整体容器&#xff0c;包括背景、边框和文字&#xf…

人工智能的研究方向

人工智能的应用、技术与基础研究方向 人工智能&#xff08;AI&#xff09;的发展已经渗透到社会的每一个角落&#xff0c;从自动驾驶汽车到智能语音助手&#xff0c;从图像识别到疾病诊断&#xff0c;AI技术正在重塑我们的工作和生活方式。为了更好地理解这一领域的广泛性和深度…

管理十大定律:深度解析与实际应用

在复杂多变的企业管理环境中&#xff0c;掌握并运用一些基本的定律和规律&#xff0c;对于提升管理效率、优化资源配置具有至关重要的作用。 1、马太效应 定律解析&#xff1a;马太效应描述了资源分配中的一种累积优势现象&#xff0c;即强者愈强&#xff0c;弱者愈弱。这源…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

RAG 实践-Ollama+AnythingLLM 搭建本地知识库

什么是 RAG RAG&#xff0c;即检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种先进的自然语言处理技术架构&#xff0c;它旨在克服传统大型语言模型&#xff08;LLMs&#xff09;在处理开放域问题时的信息容量限制和时效性不足。RAG的…

wmv转换mp4怎么操作?3个格式转换方法分享

wmv转换mp4怎么操作&#xff1f;将WMV转换为MP4格式&#xff0c;可以方便我们在多种设备和平台上流畅播放视频。MP4格式具有广泛的兼容性和优化过的编码&#xff0c;使其在各种媒体播放器、智能手机、平板电脑以及电视上都能得到良好的支持。此外&#xff0c;MP4格式的视频文件…

12.1 Go 测试的概念

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

C语言——自定义类型:结构体

前言 本篇博客位大家介绍C语言中一块儿重要的内容&#xff0c;那就是结构体&#xff0c;关于结构体的内容&#xff0c;大家需要深入掌握&#xff0c;在后面的学习中依然会用到&#xff0c;如果你对本文感兴趣&#xff0c;麻烦点进来的老铁一键三连。多多支持&#xff0c;下面我…

WPS JS宏获取自动筛选后的行数

//WPS JS宏获取自动筛选后的行数 function getFilterRowCnt(shtRng)//shtRng表示筛选目标工作表范围 {let lngRowCnt 0;for(let rngCell of shtRng.SpecialCells(xlCellTypeVisible).Areas)//获取自动筛选后的单元格行数{lngRowCnt lngRowCnt rngCell.Rows.Count;}return ln…

Metes and Bounds Pro for Mac——开启智能地产测量新时代

在数字化时代&#xff0c;Metes and Bounds Pro for Mac以其智能化和高效性引领了地产测量领域的新潮流。这款软件采用了先进的人工智能技术&#xff0c;能够自动识别和提取地块信息&#xff0c;极大地提高了测量工作的速度和准确性。此外&#xff0c;Metes and Bounds Pro还支…

【GreenHills】如何使用GHS对于不同的文件进行文档内容对比

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 利用GHS对于不同的文件进行对比。 2、 问题场景 在项目开发过程中&#xff0c;会对于工程进行版本管理&#xff0c;对于没有项目管理工具的客户&#xff0c;想要对于当前版本的源文件和上一版或其他版本的源文件进行…

Anzo Capital昂首资本总结斐波纳契指标7个特点

斐波纳契指标是一种强大的技术分析工具&#xff0c;被誉为交易者的“神秘武器”&#xff0c;用于预测金融市场中的价格走势和潜在反转点。下面是Anzo Capital昂首资本总结的斐波纳契指标的7个特点&#xff1a; 1. 识别趋势&#xff1a;首先&#xff0c;斐波纳契指标可以快速确…

旅游行业电商平台:数字化转型的引擎与未来发展趋势

引言 旅游行业数字化转型的背景和重要性 随着信息技术的飞速发展&#xff0c;数字化转型成为各行业发展的必然趋势。旅游行业&#xff0c;作为一个高度依赖信息和服务的领域&#xff0c;数字化转型尤为重要。通过数字化手段&#xff0c;旅游行业能够实现资源的高效配置、服务的…

tvm实战踩坑

今天玩了一下tvm的安装 我要安装v0.14.0的版本 所以按照官网的方法 https://tvm.apache.org/docs/install/from_source.html#python-package-installation git clone --recursive https://github.com/apache/tvm tvmgit checkout v0.14.0recursive是很重要的 这一步可以替换成…

蓝桥杯软件测试第十五届蓝桥杯模拟赛1期题目解析

PS 需要第十五界蓝桥杯模拟赛1期功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试模拟赛1期 题目1 功能测试用例1&#xff08;测试用例&#xff09;&#xff08;15分&#xff09; 【前期准备】 按步…

优化查询性能:DolphinDB 时间类型数据比较规则详解

在数据库中&#xff0c;时间是一种常见的数据类型。在处理时间数据时&#xff0c;比较操作是非常常见的需求。然而&#xff0c;在不同的场景下&#xff0c;对时间类型数据进行比较时应用的规则不同。本文将从 DolphinDB 支持的时间类型开始&#xff0c;由浅入深分别介绍时间类型…

鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)

3、MMU汇编代码 在arch\arm\arm\include\arm.h文件中&#xff0c;封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。 3.1 CP15 C2 TTBR转换表基地址寄存器 代码比较简单&#xff0c;结合下图&#xff0c;自行查看即可。该图来自《ARM Cortex-A9 Tec…