Java-多线程-CompletableFuture
CompletableFuture
是 Java 8 中引入的一个重要类,它实现了 Future
接口,并且扩展了 CompletionStage
接口,提供了比传统 Future
更加丰富和灵活的功能。CompletableFuture
旨在简化异步编程模型,并且通过函数式编程的能力,使得异步代码的编写变得更加简洁和易于理解。
创建 CompletableFuture
CompletableFuture
可以通过多种方式创建,例如使用 completedFuture()
方法创建一个已完成的 CompletableFuture
:
1 | CompletableFuture<String> future = CompletableFuture.completedFuture("hello!"); |
异步任务
对于异步任务,CompletableFuture
提供了 supplyAsync
和 runAsync
方法。supplyAsync
创建一个带有返回值的异步任务,而 runAsync
则用于没有返回值的任务:
1 | CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> { |
任务编排
CompletableFuture
支持任务之间的编排,这意味着可以轻松地组织不同任务的运行顺序、规则以及方式。例如,可以使用 thenApply
方法来等待前一个任务结束,并拿到结果后继续处理:
1 | CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello") |
异常处理
CompletableFuture
还提供了异常处理机制,例如使用 exceptionally
方法可以处理前面阶段抛出的异常:
1 | CompletableFuture<String> result = CompletableFuture.supplyAsync(() -> { |
组合多个任务
CompletableFuture
支持多个任务的组合处理,例如 thenCombine
可以将两个 CompletableFuture
的结果合并:
1 | CompletableFuture<String> first = CompletableFuture.supplyAsync(() -> "Hello"); |
自定义线程池
默认情况下,CompletableFuture
使用 ForkJoinPool.commonPool()
作为执行异步任务的线程池,但也可以指定其他线程池:
1 | ExecutorService executor = Executors.newFixedThreadPool(10); |
总结
通过使用 CompletableFuture
,开发人员可以更方便地管理异步任务,减少回调地狱的问题,并且能够以声明式的方式来编写异步代码。这对于提高代码的可读性和可维护性是非常有益的。此外,由于 CompletableFuture
的灵活性,它也适用于多种并发编程场景,如Web服务调用、数据库访问等。