Java 8 CompletableFuture 学习及实践笔记

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.mzph.cn/news/89012.shtml

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

相关文章

pve关闭windows虚拟机慢

背景&#xff1a; 在web界面关闭windows虚拟机一直转圈&#xff0c;使用命令行关闭报错 qm stop 155 trying to acquire lock... cant lock file /var/lock/qemu-server/lock-155.conf - got timeout解决 删除lock&#xff0c;然后用命令行重新关闭 rm /var/lock/qemu-serve…

全网最全Python系列教程(非常详细)---字符串讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中字符串的讲解&#xff0c;涉及到以下内容&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 本文将从以下几个方面展开对字符串的讲解&#xff1a; 1、字…

如何使用docker快速部署MinDoc文档系统

MinDoc是非常优秀的知识分享系统&#xff0c;但是很多刚接触的人会一脸懵逼&#xff0c;而且官方文档写的也并不清晰&#xff0c;所以和大家分享一下快速部署MinDoc的方法。 首先docker环境先自行安装好&#xff0c;这里不再赘述。 拉取docker镜像&#xff1a; docker pull …

利用 Forcing InnoDB Recovery 特性解决 MySQL 重启失败的问题

问题 由于异常断电或者系统异常重启时 MySQL 没有正常退出导致 MySQL 无法启动&#xff0c;启动时报错如下&#xff1a; [System] [Server] /usr/sbin/mysqld (mysqld 8.0.30) starting as process 2665 [System] [InnoDB] InnoDB initialization has started. [System] [Inn…

golang 对不同结构体中数据进行相互转换的几种常用方法

常用的不同结构体中的数据相互转换的方法 1. 利用json包的marshal和unmarshal 要求&#xff1a;json标签的值必须一致 示例: package main import ("encoding/json""fmt" ) type A struct {Name string json:"name"Age int json:"age&qu…

【开发篇】九、SpringBoot整合ES(ElasticSearch)

文章目录 1、整合2、简单示例3、一点补充4、增删改查索引与文档 1、整合 整合思路都一样&#xff0c;先起步依赖或普通依赖&#xff0c;再配置&#xff0c;再封装的操作对象。先引入依赖&#xff1a; <dependency> <groupId>org.springframework.boot</grou…

基于Java的电影评论网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于Java的电影评论网站…

内存泄漏,内存溢出,抽象类和接口,netstat、ping、ifconfig的区别

持续学习是我们必备的技能之一&#xff0c;保持与时俱进&#xff0c;保持行业的敏感度&#xff0c;关注行业发展趋势&#xff0c;了解新技术&#xff0c;加强自己的认知&#xff0c;积极的应对变化 内存泄漏 memory leak 是指程序在申请内存后&#xff0c;无法释放已申请的内…

Oracle去重去空

1. -- 去重函数 DISTINCT SELECT DISTINCT E.JOB FROM EMP E -- 只能放在 SELECT 后面,或 函数的括号里面 2. -- 分组去重 SELECT E.JOB FROM EMP E GROUP BY E.JOB -- 去空值 NVL (字段,默认值) -- 空值特性: 1. 空值和任何值进行算术运算都为空 2. 空值跟任何进行…

Linux centos7压缩包安装mysql-8.0.34 并设置开机自启

下载安装解包 并解压 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34-linux-glibc2.12-x86_64.tar.xztar -xf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xzmv mysql-8.0.34-linux-glibc2.12-x86_64 /usr/local/mysql初始化数据及安装操作 配置mysql配置文…

IntelliJ IDEA - Maven 在控制台Maven编译正常,但是在IDEA中不正常,表现不一致

文章目录 现象原因解决验证 现象 一个Maven项目&#xff0c;当导入到IDEA后&#xff0c;无法在IDEA中正常的编译和下载jar依赖&#xff0c;类似下面的截图。 但是在Windows控制台却可以正常编译&#xff0c;类似下面的截图。 CMD执行&#xff1a;mvn clean install -Dmaven.te…

水库河道生态流量监测系统的主要内容

一、系统背景 我国为保护河流生态环境&#xff0c;推动水资源科学、合理、有序开发和可持续利用&#xff0c;各地水利和环保部门相继出台措施对不满足生态流量下泄要求的水电站责令整改或挂牌督办。近几年几百家水库在各个主要流域建成&#xff0c;由于缺乏对各个水库生态下泄流…

蓝牙核心规范(V5.4)11.5-LE Audio 笔记之Context Type

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!! 蓝牙中的上下文类型(Context Type)是用于描述音频流当前使用情况或相关使用情…

【Java】集合 之 使用List

在集合类中&#xff0c;List是最基础的一种集合&#xff1a;它是一种有序列表。 List的行为和数组几乎完全相同&#xff1a;List内部按照放入元素的先后顺序存放&#xff0c;每个元素都可以通过索引确定自己的位置&#xff0c;List的索引和数组一样&#xff0c;从0开始。 数组…

为什么说软文能够扩大中小企业的品牌影响力?

在当今的商业环境中&#xff0c;品牌影响力对于企业的成功至关重要。对于中小企业来说&#xff0c;利用软文来打造品牌影响力是一种成本低且效果更高的方式。为什么说软文能够扩大中小企业的品牌影响力呢&#xff1f;下面就让媒介盒子告诉你。 一、塑造品牌形象 首先&#xff…

走心分享!天津诚筑说Java大数据培训我该如何选择?

随着互联网的发展&#xff0c;IT行业变得越来越炙手可热&#xff0c;其中较为火热的当属大数据和Java了&#xff0c;许多学员都很纠结&#xff0c;Java和大数据我应该如何选择呢?今天小编带大家了解一下Java和大数据之间的区别&#xff01; Java和大数据的关系 Java是一种面…

Verilog中什么是断言?

断言就是在我们的程序中插入一句代码&#xff0c;这句代码只有仿真的时候才会生效&#xff0c;这段代码的作用是帮助我们判断某个条件是否满足&#xff08;例如某个数据是否超出了范围&#xff09;&#xff0c;如果条件不满足&#xff08;数据超出了范围&#xff09;&#xff0…

搭建安信可小安派Windows 开发环境

搭建小安派Windows 开发环境 Ai-Pi-Eyes 系列是安信可开源团队专门为Ai-M61-32S设计的开发板&#xff0c;支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口&#xff0c;具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SP…

Mojo:新AI语言中的7个惊人的Python升级

一、说明 AI发展是日新月异的&#xff0c;对于新模型的产生&#xff0c;我们不能不给以关注。Mojo就是一种新发布的编程语言&#xff0c;专为AI开发人员制作&#xff0c;由Modular制作&#xff0c;Modular是一家由Swift的原始创建者Chris Lattner创立的公司。 二、关于MOJO的概…

人生第一个项目(学生管理系统)(进阶版)

题目: package Project.Student_system_upper版;public class 题目学生股那里系统upper {//增删改查可以直接参照之前的文件代码(cv大法)/* 为学生管理系统写一个登录,注册,忘记密码的功能只有用户登陆成功之后,才能进入到学生管理系统中进行相应操作*//*分析:1. 登陆界面需要…