推荐使用 CompletableFuture 框架进行异步操作,很强很方便
文章目录
- 1. 基础概念
- 2. 创建 CompletableFuture
- 2.1 异步执行无返回值的任务
- 2.2 异步执行有返回值的任务
- 3. 组合 CompletableFuture
- 3.1 顺序组合
- 3.2 并行组合
- 4. 异常处理
- 5. 等待异步操作完成
- 6. 取消异步操作
- 7. 处理多个 CompletableFuture
- 8. 实际应用示例
- 结论
- 推荐阅读文章
在Java 8及更高版本中,
CompletableFuture
提供了一种强大的方式来处理异步编程。它不仅简化了回调,还提供了丰富的API来组合异步操作、处理异常和控制流程。下面介绍几个
CompletableFuture
框架中最常用的几个方法:
1. 基础概念
CompletableFuture
是一个可以异步完成操作的类,它提供了一个可写的 Future
。这意味着你可以从异步计算中主动完成结果,或者在计算完成时被动接收结果。
2. 创建 CompletableFuture
2.1 异步执行无返回值的任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 执行异步任务
});
2.2 异步执行有返回值的任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行异步任务并返回结果return "Hello, CompletableFuture!";
});
3. 组合 CompletableFuture
3.1 顺序组合
使用 thenApply
方法来顺序组合异步操作,它接收一个函数,该函数会在前一个 CompletableFuture
完成后被调用。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello").thenApplyAsync(s -> s + ", CompletableFuture!");
3.2 并行组合
使用 thenCombine
方法来并行组合异步操作,它接收另一个 CompletableFuture
和一个双函数,该函数会在两个 CompletableFuture
都完成后被调用。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<String> combined = future1.thenCombine(future2, (s, i) -> s + i);
4. 异常处理
exceptionally
方法可以用来处理 CompletableFuture
中发生的异常。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Error!");
}).exceptionally(ex -> {// 处理异常return "Default Value";
});
5. 等待异步操作完成
join
方法可以用来阻塞当前线程直到 CompletableFuture
完成。
String result = future.join(); // 阻塞直到 future 完成
6. 取消异步操作
CompletableFuture
支持取消异步操作。
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 长时间运行的任务
});
future.cancel(true); // 取消任务
7. 处理多个 CompletableFuture
CompletableFuture
提供了 allOf
方法来等待多个异步操作完成。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join(); // 等待所有 future 完成
8. 实际应用示例
假设我们需要从两个不同的服务中获取数据,并将结果合并。
CompletableFuture<String> data1 = CompletableFuture.supplyAsync(() -> fetchDataFromService1());
CompletableFuture<String> data2 = CompletableFuture.supplyAsync(() -> fetchDataFromService2());
CompletableFuture<String> combinedData = data1.thenCombine(data2, (s1, s2) -> s1 + " " + s2);
String result = combinedData.join();
结论
CompletableFuture
是Java异步编程的强大工具,它提供了一种简洁且强大的方式来处理异步任务。通过本文的介绍,你应该能够开始在你的项目中使用 CompletableFuture
来简化异步代码,并提高程序的响应性和性能。
不过你得注意异步的时候,上下文无法传递的问题哦。这个你可以通过自定义线程池来解决!
推荐阅读文章
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
什么是 Cookie?简单介绍与使用方法
-
什么是 Session?如何应用?
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
如何理解应用 Java 多线程与并发编程?
-
把握Java泛型的艺术:协变、逆变与不可变性一网打尽
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
如何理解线程安全这个概念?
-
理解 Java 桥接方法
-
Spring 整合嵌入式 Tomcat 容器
-
Tomcat 如何加载 SpringMVC 组件
-
“在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
-
“避免序列化灾难:掌握实现 Serializable 的真相!(二)”
-
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
-
解密 Redis:如何通过 IO 多路复用征服高并发挑战!
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
-
Java 中消除 If-else 技巧总结
-
线程池的核心参数配置(仅供参考)
-
【人工智能】聊聊Transformer,深度学习的一股清流(13)
-
Java 枚举的几个常用技巧,你可以试着用用