completableFuture
CompletableFuture
是 Java 8 引入的一个高性能的异步编程工具,它扩展了 Future
接口,并提供了一种更加灵活的方式来处理异步操作的结果。 CompletableFuture
提供了丰富的 API 来支持异步编程,包括完成异步操作、组合异步操作、处理完成结果等。
下面是一些 CompletableFuture
的关键特性和使用示例:
关键特性
supplyAsync: 用于创建一个异步任务,该任务最终会产生一个结果。 接受一个 Supplier 函数式接口作为参数。 返回一个 CompletableFuture 实例,其中 T 是任务的结果类型。 runAsync: 用于创建一个异步任务,该任务不产生任何结果。 接受一个 Runnable 作为参数。 返回一个 CompletableFuture实例。
异步操作:
supplyAsync
: 异步执行一个函数并返回一个CompletableFuture
。runAsync
: 异步执行一个 Runnable 任务。
组合操作:
thenApply
: 在当前CompletableFuture
完成后,对其结果应用一个函数。thenCompose
: 在当前CompletableFuture
完成后,返回一个新的CompletableFuture
。thenAccept
: 在当前CompletableFuture
完成后,消费其结果。thenCombine
: 结合两个CompletableFuture
,在两者都完成时,使用一个函数处理两个结果。thenRun
: 在当前CompletableFuture
完成后,执行一个 Runnable 任务。
错误处理:
exceptionally
: 处理完成异常的情况。handle
: 处理完成结果,无论是否异常。
完成控制:
complete
: 手动完成一个CompletableFuture
。cancel
: 尝试取消一个CompletableFuture
。isDone
: 检查CompletableFuture
是否已完成。join
: 阻塞并等待CompletableFuture
完成。
示例
下面是一个简单的示例,展示如何使用 CompletableFuture
来执行异步任务:
java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) {
// 创建一个CompletableFuture实例,通过supplyAsync()方法异步获取一个值
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
try {
// 模拟耗时操作
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100; // 返回一个整数值
});
// 处理future的结果
future.thenAccept(result -> {
System.out.println("异步计算的结果是: " + result);
});
// 主线程继续执行其他任务
System.out.println("主线程继续执行其他任务...");
// 如果需要阻塞等待结果
try {
int result = future.get(); // 阻塞直到计算完成
System.out.println("最终结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个例子中:
- 使用
supplyAsync()
创建了一个异步任务,该任务将在后台线程中运行,并返回一个整数值。 - 使用
thenAccept()
方法注册了一个回调函数,当异步任务完成后,这个回调函数将被调用来处理结果。 - 主线程会继续执行其他任务,而不会等待
CompletableFuture
的结果。 - 最后,如果需要,可以使用
get()
方法来阻塞等待结果。
CompletableFuture
提供了许多其他有用的方法来处理更复杂的异步场景,例如错误处理、取消操作、超时控制等。