CompletableFuture 是 Java 8 引入的一个类,位于 java.util.concurrent
包中。它是 Future
接口的一个实现,提供了更强大的异步编程能力。CompletableFuture 不仅支持异步任务的执行,还支持任务之间的依赖关系、组合操作以及异常处理。
1. 基本概念
- Future:
Future
是 Java 5 引入的一个接口,用于表示异步计算的结果。它允许你检查计算是否完成,等待计算完成,并获取计算结果。 - CompletableFuture:
CompletableFuture
是Future
的增强版,提供了更多的功能,如任务组合、异常处理、手动完成任务等。
2. 创建 CompletableFuture
- 使用
supplyAsync
或runAsync
:supplyAsync
用于有返回值的异步任务。runAsync
用于无返回值的异步任务。CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 异步任务 return "Hello, World!"; }); CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { // 异步任务 });
- 手动完成:
- 你可以手动完成一个
CompletableFuture
,并设置其结果或异常。CompletableFuture<String> future = new CompletableFuture<>(); future.complete("Manual Completion");
- 你可以手动完成一个
3. 任务组合
thenApply
:对前一个任务的结果进行转换。thenAccept
:消费前一个任务的结果,无返回值。thenRun
:在前一个任务完成后执行一个操作,不关心前一个任务的结果。thenCompose
:用于将两个CompletableFuture
串联起来,前一个任务的结果作为下一个任务的输入。thenCombine
:用于将两个CompletableFuture
并行执行,并在两者都完成后对结果进行合并。
4. 异常处理
exceptionally
:处理任务执行过程中抛出的异常,并返回一个默认值。handle
:无论任务是否正常完成,都会执行的处理方法,可以同时处理结果和异常。
5. 多任务组合
allOf
:等待所有任务完成。anyOf
:等待任意一个任务完成。CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Task 1"); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "Task 2"); CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2); allFutures.thenRun(() -> { System.out.println("All tasks completed"); }); CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2); anyFuture.thenAccept(System.out::println); // 输出最先完成的任务结果
6. 超时控制
- Java 9 引入了
orTimeout
和completeOnTimeout
方法,用于控制任务的超时行为。
7. 总结
- CompletableFuture 提供了强大的异步编程能力,支持任务组合、异常处理、超时控制等功能。
- 它适用于复杂的异步编程场景,能够显著提高代码的可读性和可维护性。
- 通过合理使用
CompletableFuture
,可以构建高效、灵活的并发应用程序。
THE END
暂无评论内容