6.1 実行可能オブジェクト

これで、パッケージの最大の部分に到達しました。Future インターフェイスと Callable インターフェイスを通じて結果を取得できる非同期タスクを実行するためのインターフェイス、およびスレッド プール (ThreadPoolExecutor、ScheduledPoolExecutor、ForkJoinPool) を作成するためのサービスとファクトリについて説明します。

理解を深めるために、インターフェースとクラスを少し分解してみましょう。

6.2 実行可能オブジェクトの実現

Future<V>は、非同期操作の結果を取得するための素晴らしいインターフェイスです。ここでの重要なメソッドは get メソッドです。このメソッドは、別のスレッドでの非同期操作が完了するまで、現在のスレッドを (タイムアウトの有無にかかわらず) ブロックします。操作をキャンセルして現在のステータスを確認するための追加の方法もあります。FutureTask クラスは実装としてよく使用されます。

RunnableFuture<V>- Future がクライアント API のインターフェイスである場合、RunnableFuture インターフェイスは非同期部分の開始にすでに使用されています。run() メソッドが正常に完了すると、非同期操作が終了し、get メソッドを介して結果を取得できるようになります。

Callable<V>- 非同期操作用の Runnable インターフェイスの拡張類似物。型指定された値を返し、チェックされた例外をスローすることができます。このインターフェースには run() メソッドがありませんが、多くの java.util.concurrent クラスは Runnable とともにこれをサポートしています。

FutureTask<V>— Future/RunnableFuture インターフェイスの実装。非同期操作は、Runnable オブジェクトまたは Callable オブジェクトの形式でコンストラクターの 1 つへの入力として取得されます。FutureTask クラス自体は、たとえば new Thread(task).start() または ThreadPoolExecutor 経由でワーカー スレッドで起動されるように設計されています。非同期操作の結果は、get(...) メソッドを介して取得されます。

Delayed- DelayQueue だけでなく、将来開始する必要がある非同期タスクに使用されます。非同期操作を開始する前の時間を設定できます。

ScheduledFuture<V>- Future インターフェイスと Delayed インターフェイスを組み合わせたマーカー インターフェイス。

RunnableScheduledFuture<V>- RunnableFuture と ScheduledFuture を組み合わせたインターフェイス。さらに、タスクを 1 回限りのタスクにするか、指定した頻度で実行するかを指定できます。