CompletableFuture 学习及实践笔记
CompletableFuture 是 Java 8 引入的一个强大的异步编程工具,它提供了一种简洁而灵活的方式来处理异步操作和构建复杂的异步流程。
创建 CompletableFuture
使用 CompletableFuture.supplyAsync(Supplier<U> supplier)
方法创建一个 CompletableFuture,该方法会异步执行提供的 Supplier 函数,并返回一个 CompletableFuture 对象。
使用 CompletableFuture.runAsync(Runnable runnable)
方法创建一个 CompletableFuture,该方法会异步执行提供的 Runnable 函数,并返回一个 CompletableFuture 对象。
异步操作和回调
使用 thenApply(Function<? super T,? extends U> function)
方法可以在 CompletableFuture 中注册一个转换函数,当 CompletableFuture 完成时,将触发该函数,并将结果传递给下一个 CompletableFuture。
使用 thenAccept(Consumer<? super T> action)
方法可以注册一个消费者函数,当 CompletableFuture 完成时,将触发该函数,并处理结果。
使用 thenRun(Runnable action)
方法可以注册一个 Runnable 函数,当 CompletableFuture 完成时,将触发该函数,不接收任何输入。
异常处理
使用 exceptionally(Function<Throwable,? extends T> exceptionFunction)
方法可以注册一个异常处理函数,当 CompletableFuture 发生异常时,将触发该函数,并返回一个备选结果。
使用 handle(BiFunction<? super T,Throwable,? extends U> handler)
方法可以注册一个处理函数,当 CompletableFuture 完成时,无论是正常结果还是异常结果,都会触发该函数。
组合多个 CompletableFuture
使用 thenCompose(Function<? super T, ? extends CompletionStage<U>> fn)
方法可以将两个 CompletableFuture 链接起来,当第一个 CompletableFuture 完成时,将触发提供的函数,并返回一个新的 CompletableFuture 对象。
使用 thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn)
方法可以组合两个 CompletableFuture 的结果,并在两者都完成时触发提供的函数。
使用 allOf(CompletableFuture<?>... cfs)
方法可以等待多个 CompletableFuture 都完成后再执行某个操作。
等待 CompletableFuture 完成
使用 get()
方法可以阻塞当前线程,直到 CompletableFuture 完成,并获取 CompletableFuture 的结果。
使用 join()
方法可以等待 CompletableFuture 完成,并获取 CompletableFuture 的结果,但不会抛出 checked 异常。
超时处理
使用 completeOnTimeout(T value, long timeout, TimeUnit unit)
方法可以设置 CompletableFuture 在指定的时间内完成,如果超过指定时间仍未完成,将使用提供的默认值进行完成。
使用 orTimeout(long timeout, TimeUnit unit)
方法可以设置 CompletableFuture 在指定的时间内完成,如果超过指定时间仍未完成,将抛出 TimeoutException。
通过学习 CompletableFuture,你可以更好地处理异步操作和复杂的异步流程,提高代码的性能和可读性。它提供了更加灵活和简洁的编程方式,使得异步编程变得更加容易和优雅。
实战
将四个线程并发执行,最后汇总执行结果
最后使用get()方法获取各线程执行结果