CompletableFuture异步

2023-11-18

更多文章,关注【码视野】

CompletableFuture是Java 8提供的一种异步编程方式,它以函数式编程API的形式提供了丰富的异步操作接口。相比于传统的Future异步方式,CompletableFuture更为灵活和易用,可以轻松地完成异步任务的处理和组合。本文将从CompletableFuture的定义、基础用法和高级用法等方面进行详细介绍,并附带JAVA代码示例。

一、CompletableFuture的定义

CompletableFuture是Java 8提供的一种异步编程方式,它是对Future异步的增强版本。与Future相比,CompletableFuture的优势在于它提供了丰富的异步操作接口,这些接口可以用于管理异步任务的执行状态、处理异步任务的结果以及组合两个或多个异步任务等。

二、CompletableFuture的基础用法

创建CompletableFuture对象

在Java中,可以通过CompletableFuture的静态工厂方法创建一个CompletableFuture对象,示例如下:

CompletableFuture<String> completableFuture = new CompletableFuture<>();

异步执行任务

使用supplyAsync方法可以异步执行一个任务,示例如下:

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {

    // 异步执行的任务

    return "Hello, CompletableFuture!";

});

获取异步执行结果

可以使用get()方法获取异步任务的执行结果,与Future相似。示例如下:

String result = completableFuture.get();

处理任务异常

在异步任务执行过程中,如果出现异常,可以通过exceptionally()方法来处理异常,示例如下:

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {

    throw new RuntimeException("Exception occurred!");

}).exceptionally(throwable -> {

    System.out.println(throwable.getMessage());

    return "Default value";

});

链式调用异步任务

使用thenApply()方法可以将一个异步任务的执行结果作为输入,进行进一步的处理,示例如下:

 

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {

    return "Hello, CompletableFuture!";

}).thenApply(result -> {

    return "Modified result: " + result;

});

组合两个异步任务

可以使用thenCompose()方法来组合两个异步任务,实现任务间的串行执行。示例如下:

CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {

    return "Hello, ";

});

CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {

    return "CompletableFuture!";

});

 

CompletableFuture<String> completableFuture3 = completableFuture1.thenCompose(result1 -> {

    return completableFuture2.thenApply(result2 -> {

        return result1 + result2;

    });

});

合并两个异步任务

使用thenCombine()方法可以将两个异步任务的执行结果进行合并,示例如下:

 

CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {

    return 2;

});

 

CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {

    return 3;

});

 

CompletableFuture<Integer> completableFuture3 = completableFuture1.thenCombine(completableFuture2, (result1, result2) -> {

    return result1 + result2;

});

三、CompletableFuture的高级用法

 

异步任务超时处理

使用completeOnTimeout()方法可以为异步任务设置超时时间,如果任务在规定时间内未执行完毕,则返回一个默认值。示例如下:

 

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {

    // 异步执行的任务

    return "Hello, CompletableFuture!";

}).completeOnTimeout("Default value", 1, TimeUnit.SECONDS);

异步任务异常处理链

使用handle()方法可以在异步任务完成后处理可能产生的异常,示例如下:

 

CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {

    throw new RuntimeException("Exception occurred!");

}).handle((result, throwable) -> {

    if (throwable != null) {

        System.out.println(throwable.getMessage());

        return "Default value";

    } else {

        return result;

    }

});

并发执行异步任务

使用allOf()或anyOf()方法可以并发执行多个异步任务,示例如下:

 

CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {

    return "Hello";

});

 

CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {

    return "CompletableFuture";

});

 

CompletableFuture<Void> completableFuture3 = CompletableFuture.allOf(completableFuture1, completableFuture2);

CompletableFuture<String> completableFuture1 = CompletableFuture.supplyAsync(() -> {

    Thread.sleep(2000);

    return "Hello";

});

 

CompletableFuture<String> completableFuture2 = CompletableFuture.supplyAsync(() -> {

    Thread.sleep(1000);

    return "CompletableFuture";

});

 

CompletableFuture<Object> completableFuture3 = CompletableFuture.anyOf(completableFuture1, completableFuture2);

四、总结

 

本文通过Java代码示例详细介绍了CompletableFuture的定义、基础用法和高级用法等。相比于传统的Future异步方式,CompletableFuture提供了更为灵活和易用的异步编程方式,能够帮助我们更好地管理异步任务的执行状态、处理异步任务的结果以及组合多个异步任务等。使用CompletableFuture能够提高程序的并发性能,并且代码编写更加简洁易懂,是异步编程的不错选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CompletableFuture异步 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • 如何在jsp代码中导入java库?

    我有以下jsp代码 我想添加 java io 等库 我怎样才能做到这一点
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • Redis系列1——数据类型和常用数据操作

    一 redis基础知识 客户端和服务器命令 默认端口号6379 服务器命令 redis server redis windows conf 设置服务一直开启 首先进入redis安装目录 然后执行 redis server service i
  • android so 调试

    安卓调试 环境 tool JDK 8X 之前用15版本的 monitor一直无法启动 链接 https pan baidu com s 12LUwB7ZOVEcblAzkO8hxyA 提取码 5lw0 monitor bat 流程 开启调试
  • mybatis学习笔记8:注解开发

    文章目录 一 基于注解的开发环境搭建以及实现查询所有 1 定义主配置文件 2 准备实体类和Dao接口 3 Dao接口定义findAll方法 以及添加注解 4 测试类定义方法测试 5 注解开发和基于xml的映射配置文件开发对比 6 注解开发的
  • 数据结构练习题——图(含应用题)

    1 选择题 1 在一个图中 所有顶点的度数之和等于图的边数的 倍 A 1 2 B 1 C 2 D 4 答案 C 2 在一个有向图中 所有顶点的入度之和等于所有顶点的出度之和的 倍 A 1 2 B 1 C 2 D 4 答案 B 解释 有向图所
  • 黄聪:微信小程序 服务器 TLS1.0 1TLS.2 配置详细教学!

    下载IISCrypto exe 点击best 工具自动推荐选中 也可以定义勾选 选择配置完成 然后点击 apply 软件弹窗提醒你 手动重启服务器 重启服务器 搞定 最后 https www ssllabs com ssltest inde
  • Linux与windows文件上传和下载

    在没有安装第三方工具的帮助下 能不能直接完成上传一个文件给服务器上 或者从服务器上下载一个文件下来 当然是可以的 你可以通过rz和sz来完成在自己的windows上上传一个文件给服务器 或者直接从服务器下载一个文件 首先第一步使用rz和sz
  • 三种SQL实现聚合字段合并(presto、hive、mysql)

    需求 按照项目名 以逗号合并参与人 presto select item name array join array agg name as group name from test test 04 group by item name o
  • Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • swagger注解之@ApiOperation

    swagger注解之 ApiOperation 链接 swagger学习一 链接 swagger学习二 ApiOperation 用于方法 表示一个http请求的操作 ApiOperation value 接口说明 httpMethod 接
  • 【Linux】Argument list too long参数列表过长的办法-四种

    1 背景 Linux下使用cp mv rm chmod等命令时经常会碰到 Argument list too long 错误 这主要是因为这些命令的参数太长 即文件个数过多 2 解决方案 方案一 将文件群手动划分为比较小的组合 user l
  • oracle 聚合函数 LISTAGG ,将多行结果合并成一行

    LISTAGG 列名 分割符号 oracle 11g 以上的版本才有的一个将指定列名的多行查询结果 用 指定的分割符号 合并成一行显示 例如 表原始数据 需求 将 mb1 Transport License list 表中的数据 根据 tr
  • 设计师winPE 更新支持Z370/Z390系列网卡 集成鲁大师远程协助QQ、检测工具、修复工具等懒得写自己看吧

    设计师winPE 更新支持Z370 Z390系列网卡 集成鲁大师远程协助QQ 检测工具 修复工具等懒得写自己看吧 网络远程版单机极速版 链接 https pan baidu com s 1BEraFYvtKNeqRkGljIbTtQ 提取码
  • 卷积运算转换为矩阵乘法

    看卷积神经网络的时候 发现代码中计算卷积是通过矩阵乘法来计算的 搜了一下发现网上这方面的资料很少 刚开始找中文的 找到两个 http blog csdn net anan1205 article details 12313593 http
  • 宽表, 窄表, 维度表, 事实表的区别

    在数据开发里 会涉及到一些概念 宽表 窄表 维度表 事实表 宽表 把多个维度的字段都放在一张表存储 增加数据冗余是为了减少关联 便于查询 查询一张表就可以查出不同维度的多个字段 窄表 和我们 mysql 普通表三范式相同 把相同维度的字段组
  • 信奥:1001Hello,World! 1002输出第二个整数 1003对齐输出

    include
  • Qt WebAssembly实验记录

    文章目录 1 安装及介绍 2 问题及解决方案 2 1 在C 中调用js函数 2 2 中文无法显示 乱码 2 3 无法输入中文 2 4 qt对应的emsdk版本 2 5 文件的下载以及上传 2 6 设置调试时的网页浏览器 2 7 编译时报空间
  • 睿象云入围

    睿象云入围 腾讯云原生加速器首期成员名单 6月30日 开源向善 应云而生 腾讯云原生加速器公布了首期入选企业名单 睿象云等 38 家优秀云原生企业从全球500多家参与企业中脱颖而出 携手腾讯共建云原生生态 面向云原生未来加速启航 产业数字化
  • 基于 ZooKeeper 搭建 Kafka 高可用集群

    kafka简介与应用场景 Apache Kafka是分布式发布 订阅消息系统 在 kafka官网上对 kafka 的定义 一个分布式发布 订阅消息传递系统 它最初由LinkedIn公司开发 Linkedin于2010年贡献给了Apache基
  • UE4学习笔记--连接MySQL数据库(C++)

    UE4学习笔记 连接MySQL数据库 我个人是个比较水的人 在学校没好好学程序 不误正业的玩建模 现在美术和程序都不行 想想还是重新认真学程序吧 先从记笔记开始 话说我还是第一次写博客 我是跟着几位大佬的博客做的 记录一下自己的问题 以免以
  • CompletableFuture异步

    更多文章 关注 码视野 CompletableFuture是Java 8提供的一种异步编程方式 它以函数式编程API的形式提供了丰富的异步操作接口 相比于传统的Future异步方式 CompletableFuture更为灵活和易用 可以轻松