CompletableFuture的whenComplete怎么使用
时间: 2023-11-10 10:03:45 浏览: 255
CompletableFuture的whenComplete是一个回调方法,可以在CompletableFuture执行完成后执行指定的操作,不管CompletableFuture正常完成还是异常完成。
whenComplete方法接收一个BiConsumer参数,该参数有两个输入参数:第一个是CompletableFuture的执行结果,第二个是Throwable,代表CompletableFuture执行过程中的异常。
下面是whenComplete的示例代码:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
future.whenComplete((result, throwable) -> {
if (throwable == null) {
System.out.println("Result: " + result);
} else {
System.out.println("Exception: " + throwable.getMessage());
}
});
```
在上面的示例代码中,supplyAsync方法返回了一个CompletableFuture实例,它会异步执行一个任务,在任务执行完成后,whenComplete方法会被调用,输出任务执行的结果或异常信息。
相关问题
completablefuture whenComplete 源码
`CompletableFuture<T>` 是 Java 8 引入的一个类,用于异步编程模型。它提供了一种强大的机制来处理复杂的异步操作链,并允许开发者编写非阻塞、回调驱动风格的代码。
### `whenComplete` 方法
`whenComplete` 是 CompletableFuture 提供的一种方法,它接受一个 BiConsumer 类型的函数式接口作为参数。这个函数会在当前阶段完成之后被触发执行,无论结果是正常结束还是抛出异常。该函数会接收两个输入参数:
1. 当前 completable future 的返回值;
2. 如果有异常,则为对应的 Throwable 对象;如果没有发生异常则为 null.
下面是 `whenComplete` 方法的部分源码解析:
```java
public CompletableFuture<Void> whenComplete(BiConsumer<? super T, ? super Throwable> action) {
return uniWhenCompleteStage(null, action);
}
private <U> CompletableFuture<U> uniWhenCompleteStage(CompletionStage<? extends U> cs,
BiFunction<?, ?, ?> fn) {
if (fn == null) throw new NullPointerException();
// 创建一个新的 AsyncRun 结构体表示此阶段的任务.
CompletableFuture<U> d = new CompletableFuture<>();
// 添加依赖关系并尝试将新任务注册到前面所有节点上,
// 确保当它们完成后能够继续向下传播直至到达最终消费者处。
UniWhenComplete<T, U> c;
withDependents(() -> {
c = new UniWhenComplete<>(d, this, castNonNull(fn));
push(c); // 把UniWhenComplete实例压入队列中等待执行
});
tryReleaseOtherNull();
// 若已有可用的结果,则立即运行给定的动作
if ((c != null && !unipush(this, c)) || isDone())
releaseOther(d);
return d;
}
```
从上面简化的源代码可以看出,在调用 `whenComplete` 后实际上创建了一个新的 `CompletableFuture` 实例 (`d`) 并关联了旧的 CompletableFutures 和指定的操作(`action`). 这样可以保证只有当原始 Future 完成时才会触发后续动作,并且整个过程是非阻塞式的。
### 使用示例
下面是一个简单的例子展示了如何使用 `whenComplete()` 来处理成功和失败的情况。
```java
import java.util.concurrent.CompletableFuture;
public class Example {
public static void main(String[] args){
CompletableFuture<String> cf =
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + ", World!")
.whenComplete((result, ex) -> {
if(ex == null)
System.out.println("Result was: "+ result );
else{
System.err.println("Exception occurred: " +ex.getMessage());
}
})
.exceptionally(thr-> {System.err.println(thr.toString());return null;});
// 主线程休眠一段时间以便于观察输出信息
sleepSecond(5);
}
private static void sleepSecond(int seconds) {
try {
Thread.sleep(seconds * 1000L);
} catch (InterruptedException e) {}
}
}
```
在这个例子中我们构建了一个包含供应者 Supplier 和映射器 Function 的异步流水线,然后附加了 `whenComplete`,不管是否有异常都会打印相关信息出来。
completablefuture.whencomplete
CompletableFuture.whenComplete方法是一个异步执行的操作,它可以在CompletableFuture执行完成时调用一个回调函数。当CompletableFuture成功返回结果或者出现异常时,该方法会自动调用回调函数并将结果传递给它,以便进行后续的处理。这个方法可以帮助我们更加灵活的处理异步操作的结果,克服了传统线程池等技术的局限性。
阅读全文
相关推荐















