モジュール java.base
パッケージ java.util.concurrent

クラスCompletableFuture<T>

java.lang.Object
java.util.concurrent.CompletableFuture<T>
型パラメータ:
T - この将来のjoinおよびgetメソッドによって返される結果タイプ
すべての実装されたインタフェース:
CompletionStage<T>, Future<T>

public class CompletableFuture<T> extends Object implements Future<T>, CompletionStage<T>
明示的に(その値とステータスを設定して)完了できるFutureです。その完了時に発生する依存関数およびアクションをサポートし、CompletionStageとして使用できます。

2つ以上のスレッドがCompletableFutureのcompletecompleteExceptionallyまたはcancelを試行すると、1つのスレッドのみが成功します。

ステータスと結果を直接操作するこれらのメソッドおよび関連メソッドに加えて、CompletableFutureには次のポリシーを持つインタフェースCompletionStageが実装されています。

  • 非同期でないメソッドの依存する完了のために提供されるアクションは、現在のCompletableFutureを完了するスレッド、または完了メソッドの他の呼出し元で実行できます。
  • 明示的なExecutor引数を持たないすべての非同期メソッドは、ForkJoinPool.commonPool()を使用して実行されます(ただし、少なくとも2個の並列性レベルがサポートされない場合は、新しいスレッドが作成されてそれぞれのタスクを実行します)。 これは、メソッドdefaultExecutor()を定義することによって、サブクラス内の非静的メソッドに対してオーバーライドできます。 モニタリング、デバッグおよび追跡を簡単にするため、生成される非同期タスクはすべてマーカー・インタフェースCompletableFuture.AsynchronousCompletionTaskのインスタンスです。 時間遅延のある操作では、このクラスで定義されたアダプタ・メソッドを使用できます。たとえば、: supplyAsync(supplier, delayedExecutor(timeout, timeUnit)) 遅延およびタイムアウトを伴うメソッドをサポートするために、このクラスは、アクションを実行するのではなく、アクションをトリガーおよび取り消すためのデーモン・スレッドを1つまで保持します。
  • CompletionStageのすべてのメソッドは、他のpublicメソッドとは独立して実装されているため、1つのメソッドの動作がサブクラス内の他のメソッドのオーバーライドによって影響されることはありません。
  • すべてのCompletionStageメソッドは、CompletableFuturesを返します。 インタフェースCompletionStageで定義されているメソッドのみに使用を制限するには、メソッドminimalCompletionStage()を使用します。 または、クライアント自身が将来を変更しないようにするには、メソッドcopy()を使用します。

CompletableFutureには、次のポリシーを持つFutureも実装されています。

  • (FutureTaskとは異なり)このクラスは自身を完了させる計算を直接制御できないため、取消しは単に別形式の例外完了として処理されます。 cancelメソッドの効果はcompleteExceptionally(new CancellationException())と同じです。 isCompletedExceptionally()メソッドは、CompletableFutureが例外で完了したかどうかを判定するために使用できます。
  • CompletionExceptionによる例外完了の場合、get()およびget(long, TimeUnit)メソッドは対応するCompletionExceptionと同じ原因でExecutionExceptionをスローします。 ほとんどのコンテキストで簡単に使用できるように、このクラスにはこれらの場合にCompletionExceptionをかわりに直接スローするjoin()およびgetNow(T)メソッドも定義されています。

それらを受け入れるメソッドの完了結果(つまり、T型のパラメータ用です)を渡すために使用される引数はnullですが、他のパラメータにnull値を渡すと、NullPointerExceptionがスローされます。

このクラスのサブクラスは、通常、CompletionStageメソッドによって返される具象型を確立する"仮想コンストラクタ"メソッドnewIncompleteFuture()をオーバーライドする必要があります。 たとえば、別のデフォルト・エグゼキュータを置換し、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(); }
 }

導入されたバージョン:
1.8