2005.12.14 株式会社四次元データ 宮澤了祐
マルチスレッドプログラミング 8章 java.util.concurrentパッケージ2
- 8.1. スケジューリング
- 8.2. Callableインタフェース
- 8.3. Futureインタフェース
8.3. Futureインタフェース
Futureオブジェクトは、非同期計算のためのインタフェースです。 計算が完了したかどうかをチェックし、計算を待機し、計算結果を取得するためのメソッドが提供されます。
Futureインタフェースが提供するメソッドは、以下があります。
- boolean cancel(boolean mayInterruptIfRunning)
- このタスクの実行の取り消しを試みます。
- V get()
- 必要に応じて、計算が完了するまで待機し、その後、結果を取得します。
- V get(long timeout, TimeUnit unit)
- 必要に応じて、計算が完了するのを、指定された時間まで待機します。
- boolean isCancelled()
- このタスクが通常どおり完了する前に、取り消された場合は true を返します。
- boolean isDone()
- このタスクが完了した場合は、true を返します。
get()メソッドは値が返って来るまで待機しますが、 待機する時間を指定することも可能です。 待機時間を指定するには次のメソッドを使います。
get(long timeout, TimeUnit unit);
指定した時間まで待機しても処理が完了しない場合は、java.util.concurrent.TimeoutException
が投げられます。
以下のように使用します。
Future<Date> future = ex.submit(new MyCallableTask()); try { System.out.println(future.get(1000,TimeUnit.MILLISECONDS)); } catch (TimeoutException e) { System.out.println("タイムアウトしました。タスクを終了します。"); future.cancel(true); if(future.isCancelled())System.out.println("タスクを終了しました。"); }
Futureのget()メソッドを呼んだ瞬間より、以下のように並列処理が同期実行されます。
Futureのget()メソッドを呼び出す際に待機する時間を指定した場合、 その時間が経過するまでタスク(を処理するスレッド)との同期を行います。 指定した時間が経過すれば、呼び出し元に処理が戻り、並列で処理が行われます。
指定した時間内に処理が完了すれば、値が返ってきます。
待機する時間を指定しなければ、計算が終了するまで同期を行います。 もし呼び出した時に既に計算が終了してればすぐに値が返ってきます。