Java 9 CompletableFuture進化小歩

6350 ワード

概要
Java 9にはCompletableFutureクラスへのいくつかの変更が付属しています.これらの変更はJEP 266の一部として導入され、JDK 8の導入以来のいくつかの問題を解決するために、より具体的には、遅延とタイムアウトをサポートし、ツールクラスといくつかの実用的な方法を抽象化する.
コードの面では,APIは8つの新しい方法と5つの新しい静的方法を提供した.OpenJDK記述によれば、このような追加を実現するために、約2400個のコード行のうち1500個が変更される.
インスタンスAPIの追加
前述したように、インスタンスAPIには、次の8つの新しい機能が付属しています.
  • Executor defaultExecutor()
  • CompletableFuture newIncompleteFuture()

  • CompletableFuture copy() CompletionStage minimalCompletionStage() CompletableFuture completeAsync(Supplier extends T> supplier, Executor executor) CompletableFuture completeAsync(Supplier extends T> supplier) CompletableFuture orTimeout(long timeout, TimeUnit unit) CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit)
    defaultExecutor()メソッド
    API
    Executor defaultExecutor()
    

    非同期メソッドが指定されていない呼び出し元にデフォルトのExecutorを返します.
    new CompletableFuture().defaultExecutor()
    
    

    これは、少なくとも1つの独立したスレッドを提供する実行スレッドを返すサブクラスによって上書きすることができる.
    新IncompleteFuture()メソッド
    API
    CompletableFuture  newIncompleteFuture()
    

    このnewIncompleteFutureは、「仮想構造関数」とも呼ばれ、同じタイプの新しいcompletableインスタンスを得るために使用されます.
    new CompletableFuture().newIncompleteFuture()
    

    この方法は、サブクラス化CompletableFutureの場合に特に有用であり、主に新しいCompletionStageを返すすべてのメソッドの内部で使用されるため、サブクラスがこのようなメソッドが返すサブタイプを制御できるようにする.
    copy()メソッド
    API
    CompletableFuture  copy()
    

    このメソッドは、次の新しいCompletableFutureを返します.
    元のCompletableFutureが正常に実行されると、copy以降のCompletableFutureも正常になります.
    元のCompletableFutureが異常Exception Xを放出すると、copy以降のCompletableFutureにもException Xが現れる
    new CompletableFuture().copy()
    

    この方法は、CompletableFutureの特定のインスタンスで依存操作をスケジュールできる「防御的レプリケーション」として使用できます.
    minimalCompletionStage()メソッド
    API
    CompletionStage  minimalCompletionStage()
    

    このメソッドは、copyメソッドの説明とまったく同じ動作をする新しいCompletionStageを返しますが、解析された値を取得または設定しようとするたびに、このような新しいインスタンスはUnsupportedOperationExceptionを放出します.
    new CompletableFuture().minimalCompletionStage()
    

    CompletionStage APIで提供されているtoCompletableFutureメソッドを使用して、使用可能なすべてのメソッドを持つ新しいCompletableFutureを取得できます.
    completeAsync()メソッド
    このcompleteAsync法は、与えられた値Supplierによって提供されるCompletableFuture非同期使用を完了するために使用されるべきである.
    API
    CompletableFuture completeAsync(Supplier extends T> supplier, Executor executor)
    CompletableFuture completeAsync(Supplier extends T> supplier)
    

    この2つのリロード方法の違いは、タスクを実行するExecutorを指定できる2番目のパラメータがあることです.指定されていない場合は、デフォルトの実行プログラム(defaultExecutorメソッドによって返されます)が使用されます.
    orTimeout()メソッド
    API
    CompletableFuture orTimeout(long timeout, TimeUnit unit)
    
    new CompletableFuture().orTimeout(1, TimeUnit.SECONDS)
    

    指定したタイムアウトの前にCompletableFutureが完了しない限り、TimeoutException例外を使用してCompletableFutureを解析します.
    completeOnTimeout()メソッド
    API
    CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit)
    
    new CompletableFuture().completeOnTimeout(value, 1, TimeUnit.SECONDS)
    

    指定したタイムアウトの前に完了しない限り、通常は指定した値を使用してCompletableFutureを完了します.
    static API
    いくつかの実用的な方法も追加されました.彼らは:
  • Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
  • Executor delayedExecutor(long delay, TimeUnit unit)
  • CompletionStage completedStage(U value)

  • CompletionStage failedStage(Throwable ex) CompletableFuture failedFuture(Throwable ex)
    メソッドの実行遅延
    Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
    Executor delayedExecutor(long delay, TimeUnit unit)
    

    指定された遅延の後に、指定された基本的な実行プログラムにタスクをコミットする新しいExecuterを返します(正数でない場合は遅延しません).遅延のたびに、返された実行プログラムのexecuteメソッドが呼び出されます.実行プログラムが指定されていない場合は、デフォルトの実行プログラム(ForkJoinPool.commonPool()が使用されます.
    メソッドcompletedStageとfailedStage
    API
     CompletionStage completedStage(U value)
     CompletionStage failedStage(Throwable ex)
    

    このユーティリティ・メソッドは、解析されたCompletionStageインスタンスを返します.これらのインスタンスは、通常、値(completedStage)を使用して完了するか、所定の例外を使用して例外(failedStage)を完了します.
    メソッドfailedFuture
    API
     CompletableFuture failedFuture(Throwable ex)
    

    failedFutureメソッドには、完了した例外CompleatebleFutureインスタンスを指定する機能が追加されています.
    使用例
    いくつかの新しいAPIの使用方法に関する例を示します.
    Delay
    この例では、特定の値を持つCompletableFutureの完了を1秒遅らせる方法を示します.これはcompleteAsync法をdelayedExecutorと併用することによって実現できる.
    CompletableFuture future = new CompletableFuture<>();
    future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
    

    completeOnTimeout
    遅延結果を実現する別の方法はcompleteOnTimeout法を用いることである.この例では、CompletableFutureを定義します.1秒後にまだ解析されていない場合は、指定された入力を使用してCompletableFutureを解析します.
    CompletableFuture future = new CompletableFuture<>();
    future.completeOnTimeout(input, 1, TimeUnit.SECONDS);
    

    Timeout
    もう1つの可能性はタイムアウトであり、TimeoutExceptionを使用して将来を異常に解決します.たとえば、それ以前に完了していない場合は、1秒後にCompletableFutureをタイムアウトします.
    CompletableFuture future = new CompletableFuture<>();
    future.orTimeout(1, TimeUnit.SECONDS);
    

    結論
    要するに、Java 9にはいくつかのCompletableFuture APIが付属しており、newIncompleteFuture仮想構造関数のため、多くのCompletionStage APIで返されるCompletionStageインスタンスを制御することができるようになりました.
    前述したように、遅延とタイムアウトをよりよくサポートできるに違いありません.追加されたユーティリティメソッドは、CompletableFutureの解析済みインスタンスを指定するための適切なモードに従います.