CompletableFuture
是Java 8引入的一种增强的Future模型,旨在解决传统Future模型的限制,支持更复杂的异步编程场景。它在java.util.concurrent
包下,实现了Future
和CompletionStage
接口。CompletableFuture
提供了一种异步执行任务的方式,并能在任务完成时对其结果进行处理。
以下是CompletableFuture
的几个关键特点:
-
异步任务链:通过
CompletableFuture
,你可以构建复杂的异步任务链。可以串联多个任务,无需阻塞等待上一个任务完成即可定义下一个任务。任务之间可以通过串行(thenApply, thenAccept, thenRun)或并行(thenCombine, thenCompose)的方式组织。 -
显式完成:可以显式地完成一个
CompletableFuture
,也就是说,你可以手动地设置其值或异常。 -
异常处理:
CompletableFuture
提供了异常处理的机制(通过exceptionally方法),允许你在链条的任何位置处理异常。 -
非阻塞异步编程:使用
CompletableFuture
可以实现完全非阻塞的编程模式,提高了程序的响应性和性能。
使用CompletableFuture
的典型示例:
创建一个CompletableFuture
你可以直接使用CompletableFuture
的静态方法来创建一个已经完成的CompletableFuture
,也可以通过工厂方法来异步执行任务。
// 使用supplyAsync来异步执行计算任务
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> "Hello, CompletableFuture!");
// 使用completedFuture创建一个已经完成的CompletableFuture
CompletableFuture<String> completedCF = CompletableFuture.completedFuture("Hello, world!");
对结果进行处理
CompletableFuture
提供了多种方法来处理计算结果:
// 使用thenApply来处理和转换结果
CompletableFuture<Integer> cf = CompletableFuture.supplyAsync(() -> "123").thenApply(Integer::parseInt);
// 使用thenAccept消费结果(不返回新的CompletableFuture)
CompletableFuture<Void> cf2 = CompletableFuture.supplyAsync(() -> "Hello").thenAccept(System.out::println);
异常处理
CompletableFuture<String> cf = CompletableFuture
.supplyAsync(() -> {
if (true) throw new RuntimeException("Exception occurred!");
return "Hello, CompletableFuture!";
})
.exceptionally(ex -> "Error: " + ex.getMessage());
组合和组合多个CompletableFuture
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> " CompletableFuture");
// 组合两个CompletableFuture,并处理它们的结果
CompletableFuture<String> result = cf1.thenCombine(cf2, (s1, s2) -> s1 + s2);
使用CompletableFuture
,可以将复杂的异步编程模型简化,提高代码的可读性并充分利用多核心处理器的计算能力。