今回も前回に引き続き、Concurrency UtilitiesのCompletableFutureクラスを紹介していきます。

 CompletableFutureクラスはFutureインタフェースを実装したクラスで、非同期に処理する複数のタスクを組み合わせて実行することができます。前回、非同期処理するタスクを組み合わせる手法について紹介しました。

 今回は、非同期処理の制御に関する機能について紹介します。また、これまでは非同期に処理するタスクが正常に完了していた場合のみを取り上げていましたが、例外が発生した場合についても取り上げます。

非同期処理の制御

 CompletedFutureクラスが実装しているFutureインタフェースは、結果の取得や処理のキャンセルなどの機能を定義しています。CompletedFutureクラスはこれらの機能に加え、独自の機能を提供しています。表1に主なメソッドを示しました。

  

表1 非同期処理の制御を行うメソッド
メソッド 説明
T get() 処理が完了するまで待機し、処理結果を返す
T get(long timeout, TimeUnit unit) 指定された時間まで処理の完了を待機し、結果を返す
T getNow(T valueIfAbsent) 処理が完了している場合は結果を返す。完了していない場合は引数で指定した値を返す
T join() 処理が完了するまで待機し、処理結果を返す
boolean complete(T value) 処理が完了していない場合、処理結果を引数で指定した値に設定し、処理を完了させる
void obtrudeValue(T value) 処理の完了に関わらず、処理結果を強制的に引数で指定した値に設定する
boolean cancel(boolean flag) 完了していない処理をキャンセルする。引数は無視される

  

 また、現在の処理の状態を調べるためのメソッドも提供されています(表2)。

  

表2 処理の状態を調べるメソッド
メソッド 説明
boolean isDone() 処理が正常に完了していたらtrueを返す
boolean isCancel() 処理が完了する前にキャンセルされたら、trueを返す

  

 では次節から、表1のメソッドについて順に紹介していきましょう。