CompletableFuture方法介绍及代码示例

CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程。它实现了 Future 接口,并提供了非常强大的功能来处理异步操作。下面是 CompletableFuture 的一些关键内部方法及其详细解释。

 基础方法

1. supplyAsync 和 runAsync:

         - supplyAsync(Supplier<U> supplier):异步执行一个任务,并返回一个包含任务结果的 CompletableFuture。Supplier 是一个可以返回结果的函数接口。
   - runAsync(Runnable runnable):异步执行一个任务,不返回结果,返回一个 CompletableFuture<Void>。

2. thenApply 和 thenAccept:

        - thenApply(Function<? super T,? extends U> fn):当 CompletableFuture 计算完成后,应用一个函数到结果上,并返回一个新的 CompletableFuture。
   - thenAccept(Consumer<? super T> action):当 CompletableFuture 计算完成后,执行一个操作并消费结果,但不返回新的 CompletableFuture。

3. thenRun:

         - thenRun(Runnable action):当 CompletableFuture 计算完成后,运行一个 Runnable,但不使用 CompletableFuture 的结果,也不返回新的 CompletableFuture。

 组合方法

4. thenCombine 和 thenCompose:

        - thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn):当两个 CompletableFuture 都完成后,应用一个函数到两个结果上,并返回一个新的 CompletableFuture。
   - thenCompose(Function<? super T,? extends CompletionStage<U>> fn):当第一个 CompletableFuture 完成后,应用一个函数到结果上,返回一个新的 CompletableFuture。

5. allOf 和 anyOf:

         - allOf(CompletableFuture<?>... cfs):返回一个新的 CompletableFuture,当所有给定的 CompletableFuture 完成后,它也完成。
   - anyOf(CompletableFuture<?>... cfs):返回一个新的 CompletableFuture,当任意一个给定的 CompletableFuture 完成后,它也完成。

 异常处理方法

6. handle 和 exceptionally:

        - handle(BiFunction<? super T, Throwable, ? extends U> fn):当 CompletableFuture 完成时,无论是正常还是异常完成,应用一个处理函数到结果或异常上,并返回一个新的 CompletableFuture。
   - exceptionally(Function<Throwable, ? extends T> fn):当 CompletableFuture 异常完成时,应用一个函数到异常上,返回一个新的 CompletableFuture。

 实例详解

下面是一个使用 CompletableFuture 的实例代码:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) throws InterruptedException, ExecutionException {// 使用 supplyAsync 创建一个异步任务CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Hello";});// thenApply 在前一个任务完成后应用一个函数CompletableFuture<String> resultFuture = future.thenApply(result -> result + " World");// get() 方法阻塞,直到计算完成String result = resultFuture.get();System.out.println(result); // 输出 "Hello World"}
}


 解释

1. 创建异步任务:

   javaCompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Hello";});

这段代码创建了一个异步任务,经过 2 秒钟后返回字符串 "Hello"。

2. 应用函数:

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

        当第一个 CompletableFuture 完成后,thenApply 方法应用一个函数,将结果 "Hello" 变为 "Hello World"。

3. 获取结果:

String result = resultFuture.get();


   get() 方法阻塞当前线程,直到 CompletableFuture 计算完成,并返回结果 "Hello World"。

CompletableFuture 提供了丰富的方法来处理异步编程的各种场景。它们的组合和使用可以使得异步代码更加简洁和易于理解。

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

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

相关文章

分布式数据库核心问题和解决方法

当下&#xff0c;由于成本压力以及数据保护的要求&#xff0c;采用国产数据库的呼声越来越高&#xff0c;但是国产数据库数量众多&#xff0c;良莠不齐&#xff0c;没有选择数据库比较靠谱的标准&#xff0c;业内真正懂得数据库的人很少&#xff0c;且为了这块大的蛋糕&#xf…

C语言中结构体使用.与->访问成员变量的区别

文章目录 前言点运算符&#xff08;.&#xff09;箭头运算符&#xff08;->&#xff09;总结 前言 在C语言中&#xff0c;. 和 -> 都是用来访问结构体成员的运算符&#xff0c;但它们的使用场景和含义有所不同。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

Axios进阶

目录 axios实例 axios请求配置 拦截器 请求拦截器 响应拦截器 取消请求 axios不仅仅是简单的用基础请求用法的形式向服务器请求数据&#xff0c;一旦请求的端口与次数变多之后&#xff0c;简单的请求用法会有些许麻烦。所以&#xff0c;axios允许我们进行创建axios实例、ax…

Retrofit 注解参数详解

添加依赖 implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 初始化Retrofit val retrofit Retrofit.Builder().baseUrl("http://api.github.com/").addConverterFactory(GsonConverterFactory…

【Kafka】Kafka提高生产者吞吐量、数据可靠性-06

【Kafka】Kafka提高生产者吞吐量-06 1. 提高生产者吞吐量2.数据可靠性2.1 回顾数据的发送流程2.2 ack应答级别2.2.1 acks:02.2.2 acks:12.2.2 acks:-1(all)2.2.2.1 数据可靠性分析2.2.2.2 数据完全可靠 2.3 可靠性总结2.4 可靠性代码配置 1. 提高生产者吞吐量 import org.apach…

科技云报道:“元年”之后,生成式AI将走向何方?

科技云报道原创。 近两年&#xff0c;以大模型为代表的生成式AI技术&#xff0c;成为引爆数字原生最重要的技术奇点&#xff0c;人们见证了各类文生应用的进展速度。Gartner预测&#xff0c;到2026年&#xff0c;超过80%的企业将使用生成式AI的API或模型&#xff0c;或在生产环…

LeetCode 第402场周赛个人题解

目录 100304. 构成整天的下标对数目 I 原题链接 思路分析 AC代码 100301. 构成整天的下标对数目 II 原题链接 思路分析 AC代码 100316. 施咒的最大总伤害 原题链接 思路分析 AC代码 100317. 数组中的峰值 原题链接 思路分析 AC代码 100304. 构成整天的下…

File API以及相关概念

一、Blob Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取&#xff0c;也可以转换成 ​ReadableStream 来用于数据操作。 构造方法 new Blob(blobParts) new Blob(blobParts,options) blobParts是一个可迭代对象&#xff08;就是能…

深度学习:PyCharm中运行Bash脚本

GitHub上的开源代码有很多是用 Bash 脚本来自动化数据处理、模型训练和模型评估等任务的&#xff0c;如何使用PyCharm来运行Bash脚本&#xff0c;从而快速上手GitHub开源代码&#xff0c;是一个实用的技巧&#xff0c;本文主要介绍PyCharm中运行Bash脚本的方法。 PyCharm 是一个…

「实战应用」如何用图表控件LightningChart JS创建SQL仪表板应用(二)

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…

OpenCore 引导完美升级

备份原有 OC (做好回滚的准备下载新版 OpenCore https://github.com/acidanthera/OpenCorePkg/releases将 1, 3, 4 里面的文件使用新版进行替换 4 里面的文件严格来说并不需要, 只是留着方便使用不追求完美到这就可以收工了将 OC 复制到 U 盘 EFI U 盘格式化可以使用: diskutil…

微服务开发与实战Day09 - Elasticsearch

一、DSL查询 Elasticsearch提供了DSL&#xff08;Domain Specific Language&#xff09;查询&#xff0c;就是以JSON格式来定义查询条件。类似这样&#xff1a; DSL查询可以分为两大类&#xff1a; 叶子查询&#xff08;Leaf query clauses&#xff09;&#xff1a;一般是在特…

Fortran 编程整理

Fortran编程语法整理 01 Fortran 中的程序单元1-1 submodule&#xff08;子模块&#xff09; 02 子程序与函数2-1 概述2-2 函数与子程序特性&#xff08;1&#xff09;为函数结果指定不同名称 03 stop命令后跟说明04 do concurrent4-1 do concurrent 的使用 05 纯过程&#xff…

Docker Jenkins(改错版本)

Devops:它强调开发(Development)和运维(Operations)团队之间的协作.实现更快,更可靠的软件交付部署. JenKins是一个开源的自动化服务器,广泛用于构建,测试和部署软件项目.它是持续集成(CI)和持续交付/部署(CD)的工具.JenKins是实现DevOps实践的重要工具. 前端项目部署一般流程:…

Matlab|基于V图的配电网电动汽车充电站选址定容-可视化

1主要内容 基于粒子群算法的电动汽车充电站和光伏最优选址和定容 关键词&#xff1a;选址定容 电动汽车 充电站位置 仿真平台&#xff1a;MATLAB 主要内容&#xff1a;代码主要做的是一个电动汽车充电站和分布式光伏的选址定容问题&#xff0c;提出了能够计及地理因素和服…

ubantu 计算一个文件夹内的文件数量命令

ubantu 计算一个文件夹内的文件数量命令 在Ubuntu中&#xff0c;你可以使用find命令来计算一个文件夹内的文件数量。以下是一个基本的命令示例&#xff1a; find /path/to/directory -type f | wc -l这里的/path/to/directory是你想要计算文件数量的文件夹的路径。find命令会…

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下&#xff0c;接到溯源任务时&#xff0c;获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包&#xff0c;看有没有攻击者…

Web前端网页源代码:深入剖析与实用技巧

Web前端网页源代码&#xff1a;深入剖析与实用技巧 在Web开发的浩瀚领域中&#xff0c;前端网页源代码扮演着至关重要的角色。它不仅是网页的骨架&#xff0c;更是实现各种交互和视觉效果的基石。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;对Web前端网页源代…

C# OpenCvSharp 矩阵计算-determinant、trace、eigen、calcCovarMatrix、solve

🚀 在C#中使用OpenCvSharp库进行矩阵操作和图像处理 在C#中使用OpenCvSharp库,可以实现各种矩阵操作和图像处理功能。以下是对所列函数的详细解释和示例,包括运算过程和结果。📊✨ 1. determinant - 计算行列式 🧮 定义: double determinant(InputArray mtx); 参数…

web前端网页实例:深度剖析与实践指南

web前端网页实例&#xff1a;深度剖析与实践指南 在数字化时代的浪潮中&#xff0c;web前端网页已成为企业与用户之间的桥梁&#xff0c;承载着信息的传递与交互的重任。本文将通过四个方面、五个方面、六个方面和七个方面的详细剖析&#xff0c;带您深入了解web前端网页实例的…