Java 8 CompletableFuture 学习及实践笔记

news2024/12/23 11:58:45

CompletableFuture 学习及实践笔记

CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,它提供了一种简洁而灵活的方式来处理异步操作和构建复杂的异步流程。

创建 CompletableFuture

使用 CompletableFuture.supplyAsync(Supplier<U> supplier) 方法创建一个 CompletableFuture,该方法会异步执行提供的 Supplier 函数,并返回一个 CompletableFuture 对象。

使用 CompletableFuture.runAsync(Runnable runnable) 方法创建一个 CompletableFuture,该方法会异步执行提供的 Runnable 函数,并返回一个 CompletableFuture 对象。

异步操作和回调

使用 thenApply(Function<? super T,? extends U> function) 方法可以在 CompletableFuture 中注册一个转换函数,当 CompletableFuture 完成时,将触发该函数,并将结果传递给下一个 CompletableFuture。

使用 thenAccept(Consumer<? super T> action) 方法可以注册一个消费者函数,当 CompletableFuture 完成时,将触发该函数,并处理结果。

使用 thenRun(Runnable action) 方法可以注册一个 Runnable 函数,当 CompletableFuture 完成时,将触发该函数,不接收任何输入。

异常处理

使用 exceptionally(Function<Throwable,? extends T> exceptionFunction) 方法可以注册一个异常处理函数,当 CompletableFuture 发生异常时,将触发该函数,并返回一个备选结果。

使用 handle(BiFunction<? super T,Throwable,? extends U> handler) 方法可以注册一个处理函数,当 CompletableFuture 完成时,无论是正常结果还是异常结果,都会触发该函数。

组合多个 CompletableFuture

使用 thenCompose(Function<? super T, ? extends CompletionStage<U>> fn) 方法可以将两个 CompletableFuture 链接起来,当第一个 CompletableFuture 完成时,将触发提供的函数,并返回一个新的 CompletableFuture 对象。

使用 thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn) 方法可以组合两个 CompletableFuture 的结果,并在两者都完成时触发提供的函数。

使用 allOf(CompletableFuture<?>... cfs) 方法可以等待多个 CompletableFuture 都完成后再执行某个操作。

等待 CompletableFuture 完成

使用 get() 方法可以阻塞当前线程,直到 CompletableFuture 完成,并获取 CompletableFuture 的结果。

使用 join() 方法可以等待 CompletableFuture 完成,并获取 CompletableFuture 的结果,但不会抛出 checked 异常。

超时处理

使用 completeOnTimeout(T value, long timeout, TimeUnit unit) 方法可以设置 CompletableFuture 在指定的时间内完成,如果超过指定时间仍未完成,将使用提供的默认值进行完成。

使用 orTimeout(long timeout, TimeUnit unit) 方法可以设置 CompletableFuture 在指定的时间内完成,如果超过指定时间仍未完成,将抛出 TimeoutException。

通过学习 CompletableFuture,你可以更好地处理异步操作和复杂的异步流程,提高代码的性能和可读性。它提供了更加灵活和简洁的编程方式,使得异步编程变得更加容易和优雅。

实战

将四个线程并发执行,最后汇总执行结果
在这里插入图片描述
最后使用get()方法获取各线程执行结果

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

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

相关文章

WindTerm 安装使用教程【图解】

往期回顾 MobaXtermMobaXterm 安装使用教程【图解】-CSDN博客WindTermWindTerm 安装使用教程【图解】-CSDN博客 一、WindTerm 功能介绍 WindTerm 是一款 Github 上开源的 SSH 终端工具&#xff0c;到目前为止它已经收获了 16.9K 颗星&#xff0c;它是完全可以比肩 MobaXterm 工…

AI写稿软件,最新的AI写稿软件有哪些

写作已经成为各行各业无法绕开的重要环节。不论是企业的广告宣传、新闻媒体的报道、还是个人自媒体的内容创作&#xff0c;文字都扮演着不可或缺的角色。随着信息的爆炸式增长&#xff0c;写作的需求也不断攀升&#xff0c;这使得许多人感到困扰。时间不够用、创意枯竭、写作技…

GICI-LIB源码阅读(三)因子图优化模型

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 三、因子图优化&#xff08;FGO&#xff09;1、因子图模型2、因子图优化状态估计模型3、因子图优化求解4、Ceres 非线性最小二乘库5、GICI-LIB 中…

山西电力市场日前价格预测【2023-09-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-28&#xff09;山西电力市场全天平均日前电价为310.91元/MWh。其中&#xff0c;最高日前电价为373.27元/MWh&#xff0c;预计出现在18: 30。最低日前电价为235.17元/MWh&#xff0c;预计…

Java基础篇 IO流

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

服务器中了360勒索病毒怎么办?勒索病毒解密,数据恢复

在众多类型的勒索病毒中&#xff0c;360勒索病毒算是占比较高、恢复难度较大的一种类型了。由于很多用户是第一次遇到这种情况&#xff0c;所以中招以后往往不知道该如何处理。所以云天数据恢复中心将根据自己的经验&#xff0c;来告诉用户服务器中了360勒索病毒怎么办。 断开网…

这3个方法,堪比U盘数据恢复大师!

“我的u盘数据可能是被我误删了&#xff0c;现在把u盘插入电脑后发现里面什么文件都没有了。这种情况还有可能恢复u盘中的数据吗&#xff1f;” 在使用u盘的过程中&#xff0c;我们可能会经常遇到u盘数据丢失的情况。先不要太担心&#xff0c;今天小编就给大家介绍一些好用的u盘…

谈谈 Redis 数据类型底层的数据结构?

谈谈 Redis 数据类型底层的数据结构? RedisObject 在 Redis 中&#xff0c;redisObject 是一个非常重要的数据结构&#xff0c;它用于保存字符串、列表、集合、哈希表和有序集合等类型的值。以下是关于 redisObject 结构体的定义&#xff1a; typedef struct redisObject {…

【python入门篇】基础知识(1)

网上关于python入门到实践的文章多不胜数&#xff0c;为什么我还要写呢&#xff1f; 一个就是对于基础知识的一个温习&#xff0c;二来就是通过详细讲解知识的同时对于自己的表达能力的一个提升&#xff0c;后续文中会出现多个案例以及练习题&#xff0c;这边我会说一些重点掌握…

韩国coupang需要懂韩文吗?平台入驻条件及费用?——站斧浏览器

coupang需要懂韩文吗 Coupang是韩国Top级电商网站&#xff0c;品类繁多&#xff0c;截止2018年&#xff0c;该网站的注册会员数超过了2500万。2017年 和 2018 年&#xff0c; Coupang APP被评为韩国受欢迎的购物APP。Coupang网站的日活移动用户数量是第二名的三倍。 那么做co…

如何在linux操作系统下安装nvm

本文主要介绍如何在linux操作系统下安装nvm&#xff0c;如果想知道nvm如何在windows操作系统下使用&#xff0c;请参考文章如何通过nvm管理多个nodejs版本_nvm 查看所有node版本-CSDN博客。 1、nvm下载 nvm全称Node Version Manager&#xff0c;即Node版本管理器。访问官网地址…

CSS笔记——伪类和伪元素

1、伪类 伪类是用于为元素在某些特定状态下添加样式的选择器。它们可以让我们为用户与页面交互时元素的外观和行为进行样式定义。 常用的伪类有: :hover &#xff0c;鼠标悬停 :active :focus &#xff0c;表单聚焦 :blur ,失去表单聚焦 :link &#xff0c;未访问 :visi…

毕业生求职应聘,性格测评怎么破?

进入到了面试和性格测试环节&#xff0c;也有很多小伙伴&#xff0c;被一个叫做性格测试的家伙给“干下来了”。性格测试这个工具&#xff0c;也没有那么神秘&#xff0c;早在头几年&#xff0c;很多大公司&#xff0c;例如阿里、美的、华为&#xff0c;都能在招聘中&#xff0…

现在的国内MBA教育是否同质化太严重?

如今在国内的MBA教育领域可以说是一片欣欣向荣&#xff0c;两百余所高校开设MBA项目招生&#xff0c;而报考市场也随着时代的发展持续升温&#xff0c;但是在这背后也存在一些问题伴随发生&#xff0c;其中就是MBA项目的同质化与跟风化趋势越来越明显&#xff0c;主要有以下几个…

每天学习3个小时能不能考上浙大MBA项目?

不少考生经常会问到上岸浙大MBA项目想要复习多长时间&#xff0c;这个问题其实没有固定答案。在行业十余年的经验总结来看&#xff0c;杭州达立易考教育认为基于每一位考生的个人复习时间、个人学习能力以及原有基础情况等不同&#xff0c;复习上岸的预期分数目标也会有差异&am…

接口测试--Postman常用断言

Postman的断言是用javascript语言写的 引入--什么是断言 结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。断言&#xff0c;是一个完整测试用例所不可或缺的一部分&#xff0c…

maven下载、本地仓库设置与idea内置maven设置

一、下载安装maven maven下载官网&#xff1a;https://maven.apache.org/download.cgi 下载到本地后解压 二、配置环境变量 我的电脑-属性-高级系统设置-环境变量/系统变量 新建MAVEN_HOME 变量值为自己的maven包所在的位置 编辑path 添加 %MAVEN_HOME%\bin 三、测试 Win…

【面试八股】IP协议八股

IP协议八股 子网掩码的作用为什么IP协议需要分片IP协议什么时候需要分片IP协议是怎么进行分片的那么IP协议是如果进行标识属于同一个分片呢&#xff1f;TCP协议和UDP协议将数据交给IP协议之后&#xff0c;是否需要分片传输&#xff1f; 子网掩码的作用 用来标识网络号和主机号…

华为数通方向HCIP-DataCom H12-831题库(单选题:181-200)

第181题 以下关于OSPF的5类LSA中的转发地址(ForwardingAddress,FA) 的描述,正确的是哪一项? A、当FA地址为0.0.0.0时,收到该LSA的路由器认为到达目的网段的数据包应该发往对应的ABR,因此将到达ABR的下一跳地址作为这条外部路由的下一跳 B、当FA地址为0.0.0.0时,收到该LS…

Excel·VBA日期时间转换提取正则表达式函数

标准日期转换 Function 标准日期(ByVal str$) As DateDim pat$, result$arr Array("(\d{4}).*?(\d{1,2}).*?(\d{1,2})", "(\d{4}).*?(\d{1}).*?(\d{1,2})")If Len(str) < 8 Then pat arr(1) Else pat arr(0)With CreateObject("vbscript.r…