Spring Boot 中的 CompletableFuture 类是什么,如何使用?

news/2024/11/23 0:47:10/

Spring Boot 中的 CompletableFuture 类是什么,如何使用?

介绍

在开发企业级应用程序时,我们经常需要异步执行任务。异步执行任务可以提高应用程序的性能和响应能力。在 Java 8 中,引入了 CompletableFuture 类,它提供了一种简单而强大的方式来执行异步任务。

Spring Boot 中的 CompletableFuture 类是基于 Java 8 的 CompletableFuture 类构建的。它提供了一种简单而强大的方式来执行异步任务,并在任务完成时执行回调函数。

在本文中,我们将介绍 Spring Boot 中的 CompletableFuture 类,并演示如何使用它来执行异步任务。

在这里插入图片描述

CompletableFuture 类

Java 8 中的 CompletableFuture 类是一种用于异步编程的新机制。它提供了一种简单而强大的方式来执行异步任务,并在任务完成时执行回调函数。

CompletableFuture 类可以理解为一种 Promise 模式的实现。Promise 模式是一种编程模式,用于异步编程。它允许我们在异步任务完成之前继续执行其他任务,然后在异步任务完成时执行回调函数。

CompletableFuture 类提供了一组方法,用于创建和组合异步任务。这些方法包括 thenApply、thenAccept、thenRun、thenCombine、thenCompose 等等。

在 Spring Boot 中,我们可以使用 CompletableFuture 类来执行异步任务。下面是一个简单的例子:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}return "Hello, world!";
});future.thenAccept(result -> System.out.println(result));

在上面的代码中,我们创建了一个 CompletableFuture 对象,它表示一个异步任务。异步任务使用 supplyAsync 方法创建,该方法接受一个 Supplier 接口作为参数。在这个例子中,我们使用 lambda 表达式实现了 Supplier 接口,返回一个字符串 “Hello, world!”。

然后,我们使用 thenAccept 方法注册一个回调函数,当异步任务完成时执行该回调函数。在这个例子中,我们简单地将结果打印到控制台上。

如何使用 CompletableFuture 类

要使用 CompletableFuture 类,请按照以下步骤操作:

第 1 步:创建异步任务

使用 CompletableFuture.supplyAsync 方法创建异步任务。supplyAsync 方法接受一个 Supplier 接口作为参数。在 Supplier 接口的实现中,实现异步任务的逻辑。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// Execute asynchronous taskreturn "Hello, world!";
});

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。异步任务使用 supplyAsync 方法创建,该方法接受一个 Supplier 接口作为参数。在 Supplier 接口的实现中,实现异步任务的逻辑。

第 2 步:注册回调函数

使用 thenAccept 方法注册一个回调函数,当异步任务完成时执行该回调函数。

future.thenAccept(result -> System.out.println(result));

在上面的代码中,我们使用 thenAccept 方法注册一个回调函数,当异步任务完成时执行该回调函数。在这个例子中,我们简单地将结果打印到控制台上。

第 3 步:等待异步任务完成

如果需要等待异步任务完成,可以使用 get 方法阻塞当前线程,直到异步任务完成。

String result = future.get();

在上面的代码中,我们使用 get 方法获取异步任务的结果。如果异步任务尚未完成,get 方法将阻塞当前线程,直到异步任务完成。

CompletableFuture 类的高级用法

CompletableFuture 类还提供了许多高级用法,可以用于组合和转换异步任务。以下是一些常用的方法:

thenApply

使用 thenApply 方法将一个 CompletableFuture 对象转换为另一个 CompletableFuture 对象。thenApply 方法接受一个 Function 接口作为参数,该接口将接受上一个 CompletableFuture 对象的结果作为输入,并返回一个新的 CompletableFuture 对象的结果。

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

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。我们使用 thenApply 方法将其转换为另一个 CompletableFuture 对象。在 thenApply 方法的实现中,我们将原始 CompletableFuture 对象的结果连接到字符串 " world" 上,然后返回一个新的 CompletableFuture 对象。

thenAccept

使用 thenAccept 方法注册一个回调函数,在异步任务完成时执行该回调函数。与上面的例子类似,但是不返回结果。

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

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。我们使用 thenAccept 方法注册一个回调函数,在异步任务完成时打印结果到控制台上。

thenRun

使用 thenRun 方法注册一个回调函数,在异步任务完成时执行该回调函数。与上面的例子类似,但是不接受任何参数。

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

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。我们使用 thenRun 方法注册一个回调函数,在异步任务完成时打印消息到控制台上。

thenCombine

使用 thenCombine 方法组合两个 CompletableFuture 对象的结果,返回一个新的 CompletableFuture 对象。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> " world");CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);

在上面的代码中,我们创建了两个 CompletableFuture 对象,分别表示两个异步任务。然后,我们使用 thenCombine 方法将这两个 CompletableFuture 对象组合起来,返回一个新的 CompletableFuture 对象。在 thenCombine 方法的实现中,我们将两个 CompletableFuture 对象的结果连接起来,然后返回一个新的 CompletableFuture 对象。

thenCompose

使用 thenCompose 方法将一个 CompletableFuture 对象转换为另一个 CompletableFuture 对象。与 thenApply 方法类似,但是 thenCompose 方法接受一个 Function 接口作为参数,该接口将返回一个新的 CompletableFuture 对象。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = future1.thenCompose(result -> CompletableFuture.supplyAsync(() -> result + " world"));

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。然后,我们使用 thenCompose 方法将其转换为另一个 CompletableFuture 对象。在 thenCompose 方法的实现中,我们使用原始 CompletableFuture 对象的结果创建一个新的 CompletableFuture 对象,并将其返回。

异常处理

在异步编程中,异常处理是一个常见的问题。CompletableFuture 类提供了一种简单而强大的方式来处理异常。

异常处理方法

在 CompletableFuture 类中,我们可以使用 exceptionally 方法来处理异步任务的异常。exceptionally 方法接受一个 Function 接口作为参数,该接口将接受一个 Throwable 对象作为输入,并返回一个新的 CompletableFuture 对象的结果。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Exception occurred");
}).exceptionally(ex -> "Handled exception: " + ex.getMessage());

在上面的代码中,我们创建了一个 CompletableFuture 对象,表示一个异步任务。我们使用 supplyAsync 方法创建异步任务,该任务总是会抛出 RuntimeException 异常。然后,我们使用 exceptionally 方法处理异常,并返回一个包含错误消息的 CompletableFuture 对象。

多个 CompletableFuture 异常处理

如果在多个 CompletableFuture 中发生异常,我们可以使用 handle 方法处理异常。handle 方法接受一个 BiFunction 接口作为参数,该接口将接受两个参数:异步任务的结果(如果成功完成)或异常(如果发生异常),以及一个 Throwable 对象(如果发生异常)。

CompletableFuture<String> future1 = CompletableFuture.sup

http://www.ppmy.cn/news/781858.html

相关文章

wps 字体对系统无效_wps 字体不显示怎么办 - 卡饭网

word文本字体显示不全怎么解决?字体全部显示出来方法介绍 word文本字体显示不全怎么解决?字体全部显示出来方法介绍 使用办公软件office或wps时,经常会到word文本字体只显示上半身或只显示下半身,而上半部分或下半部分不见了!这是为什么呢?又怎么办呢?其实造成这种情况是因…

Ubuntu下安装wps2019步骤以及字体安装

Ubuntu下安装wps2019步骤 安装过程中参考了这篇博客: link WPS安装 去 w p s wps wps 官网 link 下载安装包&#xff0c; 下载 64 64 64 位 d e b deb deb 格式。 然后&#xff0c;在下载的目录下打开终端&#xff0c; sudo dpkg -i wps-office_11.1.0.9522_amd64.deb进…

linux给wps安装字体

linux下wps安装字体方式很简单&#xff0c;但是网上很多安装方式或者安装包都是错误&#xff0c;无法更新字体的。以下正确示范&#xff1a; 1.找到Windows下安装好的字体包的位置 字体的后缀名是ttf。 第一种方法&#xff0c;这一步可以从Windows系统的c:/windows/fonts这个…

Ubuntu 解决wps缺乏字体

文章目录 Ubuntu 解决wps缺乏字体 Ubuntu 解决wps缺乏字体 移植windows字体&#xff1a; 复制 C:\Windows\Fonts\ 下的字体 到 /usr/share/fonts/truetype/windows-fonts/ truetype目录用于存放 windows的字体 刷新字体缓存&#xff1a; sudo fc-cache -f -voffice常用的字…

linux wps 微软雅黑字体,微软雅黑字体下载,微软雅黑字体下载应用到wps

微软雅黑字体下载,微软雅黑字体下载应用到wps 来源:互联网/编辑:佚名/时间:2020-10-12 在手机上看 扫一扫进入手机端 6270如何刷成微软雅黑的字体? 你们不懂就不要乱发言,鄙视你们。。。。 这个的原理就是屏蔽掉原来手机调用的Z盘上面的字体文件,然后设定让它调用MicroS…

数分面试题:经典渡河问题

问题一:狼、羊、菜 一个人带着【狼、羊、菜】过河 条件 因为狼吃羊,羊吃菜,所以不能在没有人陪同的时候把狼和羊,羊和菜单独留在岸边;有一只船,人一次只能带一个物品过河问题:怎么用最少的渡河次数,把三个物品都带到对岸 答案:7次 关键点:羊必须得单独或者和人待在一…

使用信号量Semaphore 实现多线程访问

一 semaphore多线程访问 1.1 代码 public class Xinhaoliang {public static void main(String[] args) {Semaphore semaphorenew Semaphore(3);for(int k1;k<8;k){final int mk;new Thread(new Runnable() {Overridepublic void run() {try {semaphore.acquire();Syste…

笔记本电流声解决方法

1.HP-DV系列的有电流声可以进BIOS然后再按F9&#xff0c;再退出保存。据说有位本友的DV6146是按这个步骤设置成功了&#xff0c;电流声没了。 2.还有种方法就是降频&#xff1a;在方案选项卡中去掉“自动调整中级VIDs”&#xff0c;然后将电压依次调整为0.950到1.0250v。在AC电…