前回から、Java SE 8で導入されたConcurrency UtilitiesのCompletableFutureクラスの紹介を行っています。今回はその続きです。

 簡単におさらいしておくと、CompletableFutureクラスは、非同期に処理する複数のタスクを柔軟に組み合わせて実行することができるクラスです。

 メソッドチェインでタスクを連ねていきますが、それぞれをステージと呼びます。あるステージが完了したら、次のステージというように処理を進めていきます。

 前回は基本的な使い方と、CompletableFutureオブジェクトの生成について紹介しました。今回は、非同期処理の合成について紹介していきます。

CompletableFutureのタスク

CompletableFutureクラスではタスクを表1に示す3種類のインタフェースで表します。

 

表1 CompletableFutureのタスクを表すインタフェース
インタフェース 説明
Runnable 引数なし、返り値なしのタスク
Consumer 引数あり、返り値なしのタスク
Function 引数あり、返り値ありのタスク

 

 今までのConcurrency Utilitiesと同様にRunnableインタフェースは使用されますが、Callableインタフェースは使用しません。

 例外として、前回示したようにCompletableFutureオブジェクトを生成する場合、引数なし、返り値ありのタスクを表すため、Supplierインタフェースが使用されます。

 また、2つのタスクを合成するため、引数が2つのBiConsumerインタフェース、BiFunctionインタフェースが使用されることもあります。

 なお、CompletableFutureクラスのメソッド名から使用するインタフェースを推測できます。

 メソッド名にrunが含まれている場合、Runnableインタフェースを使用してタスクを表します。メソッド名にacceptが含まれていればConsumerインタフェース、applyが含まれていればFuntionインタフェースを使用します。

 ルールを覚えれば、どのインタフェースを使えばいいかすぐに分かるはずです。

この先は会員の登録が必要です。今なら有料会員(月額プラン)が4月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら