CompletableFuture
CompletableFuture
是 Java 8 引入的一个类,它实现了 Future
和 CompletionStage
接口,用于异步编程。 它可以让你以非阻塞的方式执行任务,并在任务完成时获取结果或处理异常。
CompletableFuture
的主要特点:
- 异步执行:
CompletableFuture
允许你将任务提交给线程池或其他执行器异步执行,而无需阻塞当前线程。 - 链式调用:
CompletableFuture
提供了丰富的链式调用方法,可以让你将多个异步操作组合在一起,形成一个完整的异步流程。 - 异常处理:
CompletableFuture
提供了灵活的异常处理机制,可以让你捕获和处理异步操作中可能发生的异常。 - 组合多个
CompletableFuture
:CompletableFuture
提供了多种方法来组合多个CompletableFuture
,例如thenCombine
、thenCompose
、allOf
等。 - 手动完成:
CompletableFuture
允许你手动设置任务的结果或抛出异常,这在某些特殊场景下非常有用。
CompletableFuture
的常用方法:
- 创建
CompletableFuture
:CompletableFuture.runAsync(Runnable runnable)
: 异步执行一个Runnable
任务,没有返回值。CompletableFuture.supplyAsync(Supplier<T> supplier)
: 异步执行一个Supplier
任务,返回一个CompletableFuture<T>
对象。CompletableFuture.completedFuture(T value)
: 创建一个已经完成的CompletableFuture
,并设置结果值为value
。
- 处理结果:
thenApply(Function<T, U> fn)
: 当CompletableFuture
完成时,将结果传递给fn
函数进行处理,并返回一个新的CompletableFuture<U>
对象。thenAccept(Consumer<T> consumer)
: 当CompletableFuture
完成时,将结果传递给consumer
函数进行处理,没有返回值。thenRun(Runnable action)
: 当CompletableFuture
完成时,执行action
任务,没有返回值。
- 处理异常:
exceptionally(Function<Throwable, T> fn)
: 当CompletableFuture
发生异常时,将异常对象传递给fn
函数进行处理,并返回一个新的CompletableFuture<T>
对象。handle(BiFunction<T, Throwable, U> fn)
: 当CompletableFuture
完成时,将结果或异常对象传递给fn
函数进行处理,并返回一个新的CompletableFuture<U>
对象。whenComplete(BiConsumer<T, Throwable> action)
: 当CompletableFuture
完成时,将结果或异常对象传递给action
函数进行处理,没有返回值。
- 组合
CompletableFuture
:thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn)
: 当两个CompletableFuture
都完成时,将它们的结果传递给fn
函数进行处理,并返回一个新的CompletableFuture<V>
对象。thenCompose(Function<T, CompletionStage<U>> fn)
: 当CompletableFuture
完成时,将结果传递给fn
函数进行处理,fn
函数返回一个新的CompletableFuture<U>
对象,并将该CompletableFuture<U>
对象作为结果返回。allOf(CompletableFuture<?>... cfs)
: 当所有CompletableFuture
都完成时,返回一个新的CompletableFuture<Void>
对象。anyOf(CompletableFuture<?>... cfs)
: 当任何一个CompletableFuture
完成时,返回一个新的CompletableFuture<Object>
对象。
- 获取结果:
get()
: 阻塞当前线程,直到CompletableFuture
完成,并返回结果。 如果发生异常,则抛出ExecutionException
。get(long timeout, TimeUnit unit)
: 阻塞当前线程,直到CompletableFuture
完成,或超过指定的超时时间,并返回结果。 如果发生异常,则抛出ExecutionException
。 如果超时,则抛出TimeoutException
。join()
: 阻塞当前线程,直到CompletableFuture
完成,并返回结果。 如果发生异常,则抛出CompletionException
或RuntimeException
。getNow(T valueIfAbsent)
: 如果CompletableFuture
已经完成,则返回结果。 否则,返回valueIfAbsent
。isDone()
: 判断CompletableFuture
是否已经完成。
CompletableFuture
的使用示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class CompletableFutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {// 异步执行一个 Supplier 任务CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {System.out.println("Executing task in a separate thread...");try {Thread.sleep(2000); // 模拟耗时操作} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "Hello, CompletableFuture!";});// 处理结果future.thenAccept(result -> {System.out.println("Result: " + result);});// 处理异常future.exceptionally(ex -> {System.err.println("Exception: " + ex.getMessage());return null;});// 阻塞当前线程,直到 CompletableFuture 完成String result = future.get();System.out.println("Final Result: " + result);}
}
展开
在这个例子中,我们使用 CompletableFuture.supplyAsync()
方法异步执行一个 Supplier
任务,该任务返回一个字符串。 然后,我们使用 thenAccept()
方法处理结果,并使用 exceptionally()
方法处理异常。 最后,我们使用 get()
方法阻塞当前线程,直到 CompletableFuture
完成,并获取结果。