今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

CompletionStage

概述

CompletableFuture 是一个Future, 可以显式地完成(设置其值和状态), 并且可以用作CompletionStage, 支持依赖函数和在完成时触发的动作。 当两个或更多的线程尝试完成, completeExceptionally或取消CompletableFuture时, 只有其中一个成功。 除了这些和相关的直接操纵状态和结果的方法外, CompletableFuture还实现了以下策略的接口CompletionStage:

  • 对于非异步方法的依赖完成提供的操作可能由完成当前 CompletableFuture 的线程或完成方法的任何其他调用者执行。
  • 所有没有显式 Executor 参数的 async 方法都使用 ForkJoinPool.commonPool() 执行(除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务)。这可以在子类中通过定义 defaultExecutor() 方法来覆盖非静态方法。为简化监视,调试和跟踪,所有生成的异步任务都是 CompletableFuture.AsynchronousCompletionTask 标记接口的实例。具有延迟的操作可以使用此类中定义的适配器方法,例如:supplyAsync(supplier, delayedExecutor(timeout, timeUnit))。为了支持具有延迟和超时的方法,此类最多维护一个守护线程来触发和取消操作,而不是运行它们。
  • 所有CompletionStage方法都是独立于其他公共方法实现的,因此一个方法的行为不会受到子类中其他方法重写的影响。
  • 所有CompletionStage方法都返回CompletableFuture。要限制仅使用接口CompletionStage中定义的方法,请使用minimalCompletionStage方法。或者确保客户端不会自己修改未来,请使用copy方法。

CompletableFuture 同时实现了 Future 接口,并遵循以下策略。

  • 因为(与FutureTask不同)这个类没有直接控制导致它完成的计算, 所以取消会被视为另一种特殊完成方式。cancel方法与completeExceptionally(new CancellationException())效果相同。isCompletedExceptionally方法可用于确定CompletableFuture是否以任何特殊方式完成。
  • 这个类在异常完成时使用CompletionException,get()和get(long, TimeUnit)方法会抛出一个ExecutionException,其原因与CompletionException中所持有的相同。为了简化大多数上下文中的使用,这个类还定义了join()和getNow方法,在这些情况下直接抛出CompletionException。

在使用方法接受它们时用来传递完成结果的参数(即类型为T的参数)可能为空,但是为任何其他参数传递空值将导致抛出NullPointerException。 这个类的子类通常应该重写“虚拟构造函数”方法newIncompleteFuture,它确定了CompletionStage方法返回的具体类型。例如,这里有一个类替换了不同的默认执行程序并禁用了obtrude方法:

class MyCompletableFuture<T> extends CompletableFuture<T> {
   static final Executor myExecutor = ...;
   public MyCompletableFuture() { }
   public <U> CompletableFuture<U> newIncompleteFuture() {
     return new MyCompletableFuture<U>(); }
   public Executor defaultExecutor() {
     return myExecutor; }
   public void obtrudeValue(T value) {
     throw new UnsupportedOperationException(); }
   public void obtrudeException(Throwable ex) {
     throw new UnsupportedOperationException(); }
 }

分享到:

专栏

类型标签

网站访问总量