CompletableFuture
CompletableFuture 是 Java8 引入的一个多线程编程工具,它提供了一种方便的异步编程的方式,特别适用于解决多个任务之间存在的依赖关系的场景。下面将对 CompletableFuture 的常用方法进行详细介绍。
创建 CompletableFuture
CompletableFuture 的创建方式有很多,下面是一些常见的方式:
-
通过 CompletableFuture.supplyAsync() 方法创建 CompletableFuture:
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> { // 做一些任务 return "result"; }); -
通过 CompletableFuture.runAsync() 方法创建一个 CompletableFuture:
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> { // 做一些任务 }); -
通过 CompletableFuture.completedFuture() 方法创建一个已完成的 future:
CompletableFuture<String> completableFuture = CompletableFuture.completedFuture("hello");串行执行任务
在 CompletableFuture 中,我们可以使用 thenApply() 和 thenAccept() 方法来对一个任务的结果进行处理。
thenApply() 方法会将任务的执行结果作为参数传递给下一个任务,而 thenAccept() 方法则直接对任务的执行结果进行处理
下面是一个简单的例子:
CompletableFuture.supplyAsync(() -> "Hello") .thenApply(s -> s + " world") .thenAccept(System.out::println);这个例子中,我们先以字符串 "Hello" 为起点创建了一个 CompletableFuture,然后通过 thenApply() 方法将其处理成了 "Hello world",最后通过 thenAccept() 方法直接输出了 "Hello world"。
并行执行多个任务
使用 CompletableFuture,可以将多个任务并行执行,使用 CompletableFuture.allOf() 方法可以同时等待所有的任务执行完成。
下面是一个例子:
CompletableFuture<Void> all = CompletableFuture.allOf( CompletableFuture.runAsync(() -> { // 做一些任务1 }), CompletableFuture.runAsync(() -> { // 做一些任务2 }), CompletableFuture.runAsync(() -> { // 做一些任务3 }) );
all.join(); // 等待所有任务执行完成
异常处理
当一个 CompletableFuture 执行出现异常时,我们可以使用 exceptionally() 方法来处理这个异常。 下面是一个例子:
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
// 做一些任务
if (true) {
throw new RuntimeException("任务出现异常");
}
return "result";
})
.exceptionally(ex -> {
System.err.println("任务出现异常:" + ex);
return "exception";
});
在这个例子中,我们在任务中通过 throw 抛出了一个异常,然后通过 exceptionally() 方法将这个异常进行了处理。
结合两个 CompletableFuture 的执行结果
在 CompletableFuture 中,我们可以使用 thenCombine() 方法结合两个 CompletableFuture 的执行结果。 下面是一个例子:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> " world");
CompletableFuture<String> result = future1.thenCombine(future2, (s1, s2) -> s1 + s2);
System.out.println(result.get()); // 输出 "Hello world"
在这个例子中,我们先分别创建了两个 CompletableFuture,然后通过 thenCombine() 方法对它们的执行结果进行了结合。
其他常用方法
• thenCompose() —— 在一个 CompletableFuture 的执行结果中执行另一个 CompletableFuture。
• anyOf() —— 只要有一个 CompletableFuture 执行完成就返回。
• applyToEither() —— 当两个 CompletableFuture 中有一个执行完成时,将其执行结果作为参数传递给下一个任务。
• runAfterEither() —— 当两个 CompletableFuture 中有一个执行完成时,执行下一个任务。
• runAfterBoth() —— 当两个 CompletableFuture 都执行完成时,执行下一个任务。
以上就是 CompletableFuture 的一个简单介绍,它是一个非常强大的异步编程工具,对于解决多个任务之间依赖关系的问题非常有帮助。