一次性搞懂CompletableFuture
作为异步编程的工具类,相较于Future来说CompletableFuture支持更多的操作。由于这个类提供的方法太多,这里介绍一些常用的方法及其底层原理。
CompletableFuture基本结构介绍:
成员属性:
volatile Object result:执行结果,异步任务执行的结果就保存在这里
volatile Completion stack: 存放后置任务的栈
类方法:
CompletableFuture.supplyAsync(Supplier supplier):提交任务并返回CompletableFuture对象
CompletableFuture.supplyAsync(Supplier supplier,Executor executor):提交任务并返回CompletableFuture对象,区别是可以传入自定义线程池(推荐使用),否则将会使用默认的线程池。
CompletableFuture.runAsync(Runnable runnable):提交任务不返回结果
CompletableFuture.runAsync(Runnable runnable,Executor executor):提交任务不返回结果,区别同supplyAsync。
对象方法:
isDone():Future 任务是否完成。
public T get():获取结果,没有执行完之前会阻塞。
private Object timedGet(long nanos):获取结果,超时没有结果自动返回。
public T join():(待确认)也是获取结果。
public T getNow(T valueIfAbsent):获取结果,没有结果则立刻返回传入的值。
任务编排类型(属于后置任务处理,可以一直叠加,属于CompletableFuture的链式调用):
public CompletableFuture thenApply( Function<? super T,? extends U> fn):有入参有返回值,接收前任务的结果,进行后置处理,并返回结果。
public CompletableFuture thenAccept(Consumer<? super T> action):有入参,无返回值,接收前任务的结果,进行后置处理,不返回结果,
public CompletableFuture thenRun(Runnable action):无入参,无返回值,不接收前任务的结果,也不返回结果。
public <U,V> CompletableFuture thenCombine( CompletionStage<? extends U> other,BiFunction<? super T,? super U,? extends V> fn) :实现A+B->C效果,先执行AB任务,都完成后,再执行C任务。
一个入参为新的任务,第二个入参为前一个任务和新任务的结果,用于同时处理两个任务的结果。
public CompletableFuture acceptEither(CompletionStage<? extends T> other, Consumer<? super T> action)
??? 前两个任务,
public CompletableFuture exceptionally(Function<Throwable, ? extends T> fn):
接收异常信息,并加以处理
public static CompletableFuture allOf(CompletableFuture<?>… cfs):
接收多个任务,聚合起来,保证同时完成,并返回一个CompletableFuture。类似于CountDownLatch的作用。
public static CompletableFuture anyOf(CompletableFuture<?>… cfs):
接收多个任务,只要有一个任务返回结果,就返回结果。
常用的allOf,配合get或join一起使用
get 方法为阻塞当前线程的操作,只有和Thread.join有点类似,只有当前一个线程执行结束后才会被唤醒。