CompletableFuture与多线程结合使用

news/2024/11/25 22:05:22/

公众号请关注"果酱桑", 一起学习,一起进步!

前言

在Java 8中,引入了CompletableFuture类,它是Future的增强版,提供了更加灵活的异步编程方式,能够更好地利用多线程的优势。本文将详细讲解CompletableFuture的使用方法,并结合多线程实现异步编程。

CompletableFuture的概念

CompletableFuture是Java 8中新增的一个类,它实现了Future和CompletionStage接口,提供了一种更加灵活的异步编程方式。CompletableFuture可以看作是一个包含了计算结果的容器,可以在计算完成后获取结果,也可以在计算完成前执行一些操作。

与Future相比,CompletableFuture提供了更多的方法来处理异步计算的结果。它支持链式调用、组合多个CompletableFuture、异常处理等操作。

CompletableFuture的创建

CompletableFuture可以通过以下方式创建:

1. CompletableFuture.supplyAsync()

CompletableFuture.supplyAsync()方法可以创建一个异步计算任务,返回一个CompletableFuture对象。它接收一个Supplier类型的参数,用于执行异步计算。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});

2. CompletableFuture.runAsync()

CompletableFuture.runAsync()方法也可以创建一个异步计算任务,返回一个CompletableFuture对象。它接收一个Runnable类型的参数,用于执行异步计算。

示例代码:

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 异步计算任务System.out.println("异步计算任务执行完成");
});

3. CompletableFuture.completedFuture()

CompletableFuture.completedFuture()方法可以创建一个已经完成的CompletableFuture对象,返回一个CompletableFuture对象。它接收一个静态值作为参数,表示已经完成的计算结果。

示例代码:

CompletableFuture<String> future = CompletableFuture.completedFuture("已经完成的计算结果");

CompletableFuture的使用

1. 获取计算结果

CompletableFuture的get()方法可以用于获取计算结果,如果计算尚未完成,则会阻塞当前线程直到计算完成。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});
int result = future.get();
System.out.println(result);

2. 异步回调

CompletableFuture的thenApply()方法可以用于异步回调,它接收一个Function类型的参数,用于对计算结果进行转换。thenApply()方法返回一个新的CompletableFuture对象,它的计算结果为转换后的结果。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});
CompletableFuture<String> future2 = future.thenApply(result -> "计算结果为:" + result);
String result2 = future2.get();
System.out.println(result2);

3. 异步消费

CompletableFuture的thenAccept()方法可以用于异步消费,它接收一个Consumer类型的参数,用于对计算结果进行消费。thenAccept()方法返回一个新的CompletableFuture对象,它的计算结果为原始结果。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});
CompletableFuture<Void> future2 = future.thenAccept(result -> {System.out.println("计算结果为:" + result);
});
future2.get();

4. 异步组合

CompletableFuture的thenCompose()方法可以用于异步组合,它接收一个Function类型的参数,用于对计算结果进行组合。thenCompose()方法返回一个新的CompletableFuture对象,它的计算结果为组合后的结果。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});
CompletableFuture<Integer> future2 = future.thenCompose(result -> CompletableFuture.supplyAsync(() -> {// 异步计算任务return result * 2;
}));
int result2 = future2.get();
System.out.println(result2);

5. 异步组合多个CompletableFuture

CompletableFuture的thenCombine()方法可以用于异步组合多个CompletableFuture,它接收一个BiFunction类型的参数,用于对多个计算结果进行组合。thenCombine()方法返回一个新的CompletableFuture对象,它的计算结果为组合后的结果。

示例代码:

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 3 + 4;
});
CompletableFuture<Integer> future3 = future1.thenCombine(future2, (result1, result2) -> {// 异步计算任务return result1 + result2;
});
int result3 = future3.get();
System.out.println(result3);

6. 异常处理

CompletableFuture的exceptionally()方法可以用于异常处理,它接收一个Function类型的参数,用于处理异常情况。exceptionally()方法返回一个新的CompletableFuture对象,它的计算结果为原始结果或异常处理结果。

示例代码:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步计算任务throw new RuntimeException("计算异常");
});
CompletableFuture<Integer> future2 = future.exceptionally(e -> {System.out.println("计算出现异常:" + e.getMessage());return 0;
});
int result2 = future2.get();
System.out.println(result2);

多线程结合使用

CompletableFuture可以与多线程结合使用,实现更加高效的异步编程。下面是一个简单的示例,演示了如何使用CompletableFuture和多线程实现异步计算。

public class CompletableFutureDemo {public static void main(String[] args) throws Exception {ExecutorService executorService = Executors.newFixedThreadPool(3);CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 1 + 2;}, executorService);CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {// 异步计算任务return 3 + 4;}, executorService);CompletableFuture<Integer> future3 = future1.thenCombineAsync(future2, (result1, result2) -> {// 异步计算任务return result1 + result2;}, executorService);int result = future3.get();System.out.println(result);executorService.shutdown();}
}

在上面的示例中,我们使用了ExecutorService来创建线程池,并将其传递给CompletableFuture的方法中。这样可以控制异步计算的线程池大小,避免创建太多线程导致性能下降。

总结

CompletableFuture是Java 8中新增的一个类,它实现了Future和CompletionStage接口,提供了一种更加灵活的异步编程方式。CompletableFuture可以看作是一个包含了计算结果的容器,可以在计算完成后获取结果,也可以在计算完成前执行一些操作。

CompletableFuture提供了更多的方法来处理异步计算的结果,包括获取计算结果、异步回调、异步消费、异步组合、异常处理等操作。它可以与多线程结合使用,实现更加高效的异步编程。

在使用CompletableFuture时,需要注意线程池的大小,避免创建过多线程导致性能下降。除此之外,我们还可以使用CompletableFuture来处理大量的异步任务,提高系统的并发能力和性能。


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

相关文章

【运维】speedtest测试

目录 docker 布署 布署云端 docker布署 云端放置于已有容器里 librespeed/speedtest: Self-hosted Speedtest for HTML5 and more. Easy setup, examples, configurable, mobile friendly. Supports PHP, Node, Multiple servers, and more (github.com) docker 布署 获取…

Hadoop3.1.4分布式搭建

Hadoop3.1.4分布式搭建 1. 基础环境准备 1.1 实验网络规划 hostnameip addrroleotherk8s-m13310.10.10.133NameNode, DataNode, NodeManageerk8s-m13410.10.10.134SecondaryNameNode, DataNode, NodeManageerk8s-m13510.10.10.135ResourceManager, DataNode, NodeManageerk8…

链表反转方法汇总

反转范围之前有节点&#xff0c;prev就指向该节点&#xff0c;没有就prevnull&#xff1b; 一、头插法 class Solution {public ListNode reverseList(ListNode head) {ListNode header new ListNode(-1);ListNode cur head;while(cur ! null) {ListNode tmp cur.next;cur.…

香豆素荧光标记652966-03-5,ATTO425 acid,ATTO 425 羧酸,进行简析说明

中文名称&#xff1a;ATTO 425 羧酸 英文名称&#xff1a;ATTO425 COOH&#xff0c;ATTO-425 carboxylic acid 规格标准&#xff1a;10mg&#xff0c;25mg&#xff0c;50mg CAS&#xff1a;652966-03-5 分子式&#xff1a;C22H27NO6 分子量&#xff1a;401.46结构式&#xff1a…

Git——三大分区【工作区 / 暂存区 / 版本区】

前言&#xff1a;Git作为一个版本管理工具&#xff0c;最核心组成思想是它的三个分区&#xff1a;工作区、暂存区和工作区。 1. 工作区 Git的工作区也就是我们平时编辑代码的目录文件夹。 2. 暂存区 暂存区就是一个暂时放置修改文件记录的地方。以往仓库中放货物为例&#xf…

科技云报道:2023年安全运营之风将吹向何方?

科技云报道原创。 在实战演练成为常态化的背景下&#xff0c;建立实战化安全运营能力是一个绕不开的话题。作为网络安全发展的时代产物&#xff0c;安全运营被认为是解决现有挑战的有利方法。 但随着有安全形势、政策导向、发展需求的变化&#xff0c;安全运营的理念也在不断演…

YOLOv7 tiny 新增小目标检测层

YOLOv7 tiny 新增小目标检测层 YOLOv7 tiny 新增小目标检测层修改yolov7-tiny.yaml文件YOLOv7 tiny 结构图调用 models/yolo.py验证 YOLOv7 tiny 新增小目标检测层 根据已有的结构进行新增小目标层&#xff0c;&#xff0c;个人理解&#xff0c;仅供参考&#xff01;&#xff…

六级备考23天|CET-6|翻译技巧5|2019年12月真题|翻译荷花lotus|11:05-12:05

目录 一、中文 句子1 PRACTICE ANSWER 句子2 PRACTICE ANSWER 句子3 ​ PRACTICE ANSWER 句子4 PRACTICE ANSWER 句子5 PRACTICE ANSWER 句子6 PRACTICE ANSWER ​ 答案整合​ 一、中文 句子1 荷花是中国的名花之一&#xff0c;深受人们喜爱。 PRACTICE Lotus is one…