CompletableFuture方法
时间: 2025-04-18 13:45:02 浏览: 23
### Java `CompletableFuture` 方法使用教程
#### 创建 `CompletableFuture`
创建一个简单的 `CompletableFuture` 可以通过静态工厂方法完成。对于不带参数的任务,可以使用 `supplyAsync()` 或者 `runAsync()`。
```java
// 不返回结果的异步任务
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
System.out.println("Running async task without result");
});
// 返回字符串类型的异步任务
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
return "Hello, world!";
});
```
[^1]
#### 获取执行结果
为了获得由 `CompletableFuture` 表示的操作的结果,可调用 `.get()` 方法。这会阻塞当前线程直到计算完成并返回结果。
```java
String result = future2.join(); // 非阻塞方式获取结果
System.out.println(result);
```
[^3]
#### 处理异常
当遇到错误时,可以通过`.exceptionally(Function<Throwable,T> fn)`来指定处理逻辑;也可以利用`.handle(BiFunction<T, Throwable,R>)` 来同时处理正常情况下的值以及任何可能发生的异常。
```java
future2.exceptionally(ex -> {
ex.printStackTrace();
return "Default Value";
}).thenAccept(System.out::println);
future2.handle((s, t) -> s != null ? s : "Handled Exception").thenAccept(System.out::println);
```
[^2]
#### 组合多个 Future 对象
如果需要等待两个或更多个独立的 futures 完成后再继续下一步,则可以用 `allOf(...)` 和 `anyOf(...)`.
```java
List<CompletableFuture<?>> futures = Arrays.asList(future1,future2,...);
CompletableFuture.allOf(futures.toArray(new CompletableFuture<?>[0])).join();
// or use anyOf to get the first completed one.
CompletableFuture<Object> fastestResult = CompletableFuture.anyOf(futures.toArray(new CompletableFuture<?>[futures.size()]));
fastestResult.thenAccept(System.out::println).join();
```
#### 进行后续操作
一旦某个阶段完成了它的任务,就可以链接其他动作到这个未来对象上。比如:
- `.thenApply`: 接受前一步骤的结果作为输入,并产生新的输出;
- `.thenCompose`: 类似于 thenApply(), 但是它接受的是另一个 completable future 的供应器;
- `.thenCombine`: 将两个 completable futures 结果结合起来形成一个新的结果.
```java
CompletableFuture<Integer> cf = CompletableFuture.completedFuture(1)
.thenApply(i -> i + 1)
.thenCompose(i -> CompletableFuture.supplyAsync(() -> i * 2))
.thenCombine(CompletableFuture.supplyAsync(() -> 4), (a,b)-> a+b);
cf.thenAccept(System.out::println).join();
```
#### 手动设置结果
有时候希望模拟某些场景或者测试目的而不需要真正启动异步流程,在这种情况下可以直接设定成功/失败状态:
```java
CompletableFuture<String> manualFuture = new CompletableFuture<>();
manualFuture.complete("Manually set value");
try{
String outcome = manualFuture.get();
}catch(Exception e){
// handle exception here...
}
```
阅读全文
相关推荐














