CompletableFuture 和future的区别
时间: 2025-01-04 22:35:06 浏览: 10
### Java 中 CompletableFuture 和 Future 的差异
在未来对象方面,`Future` 接口表示异步计算的结果。通过 `get()` 方法可以尝试获取结果,在结果尚未可用的情况下会阻塞等待[^2]。
相比之下,`CompletableFuture` 是对 `Future` 功能的扩展实现,提供了更丰富的操作接口来处理异步编程场景下的任务组合与链式调用。除了继承自 `Future` 的基本功能外,还增加了许多实用的方法用于流式处理、异常处理以及与其他 `CompletableFuture` 实例交互的能力。
#### 主要特性对比:
- **完成方式**
- `Future`: 只能由执行服务自动设置状态。
- `CompletableFuture`: 支持显式地通过方法如 `complete(T)` 或者抛出异常的方式来手动标记为已完成。
- **回调机制**
- `Future`: 不具备内置的回调能力;开发者需自行管理监听器或轮询检查任务进度。
- `CompletableFuture`: 提供了多种静态工厂方法创建实例并允许注册各种形式的成功/失败回调函数(例如 `thenApply`, `handle`),这些回调会在相应事件发生时被触发执行。
- **组合多个依赖的任务**
- `Future`: 对于涉及多阶段或多输入源的操作难以表达和维护。
- `CompletableFuture`: 轻松支持复杂的流程编排,比如可以通过 `thenCompose` 将两个连续的异步动作链接起来形成新的复合型未来对象;也可以利用 `allOf` / `anyOf` 来协调一组相互独立但有关联性的子任务集合。
下面是一个简单的例子展示了如何使用这两种类型的对象来进行相似的工作:
```java
// 使用 Future 进行简单异步调用
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> futureResult = executor.submit(() -> "Hello from Future");
try {
System.out.println(futureResult.get()); // 输出: Hello from Future
} catch (InterruptedException | ExecutionException e) {
Thread.currentThread().interrupt(); // Restore interrupted status
}
// 使用 CompletableFuture 执行相同逻辑加上额外的功能
CompletableFuture.supplyAsync(() -> "Hello from CompletableFuture")
.thenAccept(System.out::println); // 同样输出: Hello from CompletableFuture
```
阅读全文