前回から、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インタフェースを使用します。

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