- 型パラメータ:
V
- このFutureのget
メソッドで返される結果型
- 既知のすべてのサブインタフェース:
RunnableFuture<V>
,RunnableScheduledFuture<V>
,ScheduledFuture<V>
- 既知のすべての実装クラス:
CompletableFuture
,CountedCompleter
,ForkJoinTask
,FutureTask
,RecursiveAction
,RecursiveTask
,SwingWorker
public interface Future<V>
Future
は、非同期計算の結果を表します。 計算が完了したかどうかのチェック、完了までの待機、計算結果の取得などを行うためのメソッドが用意されています。 この結果は、計算が完了したときに、必要に応じて準備ができるまでブロックしながらget
メソッドを使用して取得するしかありません。 取消しは、cancel
メソッドによって実行されます。 タスクが正常に完了したか取り消されたかを判断するための追加メソッドもあります。 計算が完了すると、その計算を取り消すことはできません。 利用可能な結果を得るためではなく、取消し機能としてFuture
を使用する場合は、Future<?>
という形式の型を宣言し、基本となるタスクの結果としてnull
を返すようにすることもできます。
使用例 (次のクラスはすべて架空のものです。)
interface ArchiveSearcher { String search(String target); }
class App {
ExecutorService executor = ...;
ArchiveSearcher searcher = ...;
void showSearch(String target) throws InterruptedException {
Callable<String> task = () -> searcher.search(target);
Future<String> future = executor.submit(task);
displayOtherThings(); // do other things while searching
try {
displayText(future.get()); // use future
} catch (ExecutionException ex) { cleanup(); return; }
}
}
FutureTask
クラスは、Runnable
を実装するFuture
の実装であり、そのためExecutor
によって実行されることがあります。 たとえば、submit
を使用した前述の構築は、次のように置き換えられます。
FutureTask<String> future = new FutureTask<>(task);
executor.execute(future);
メモリー整合性効果: 非同期計算によって実行されるアクションは、別のスレッド内の対応するFuture.get()
に続くアクションの前に発生します。
- 導入されたバージョン:
- 1.5
- 関連項目:
-
ネストされたクラスのサマリー
-
メソッドのサマリー
修飾子と型メソッド説明boolean
cancel
(boolean mayInterruptIfRunning) このタスクの実行の取消しを試みます。default Throwable
待機せずにタスクによってスローされた例外を返します。get()
必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。boolean
このタスクが正常に完了する前に取り消された場合はtrue
を返します。boolean
isDone()
このタスクが完了した場合はtrue
を返します。default V
計算された結果を待たずに返します。default Future.State
state()
計算状態を返します。
-
メソッドの詳細
-
cancel
boolean cancel(boolean mayInterruptIfRunning) このタスクの実行の取消しを試みます。 このメソッドは、タスクが既に完了または取消されている場合や、他の理由で取消されない場合には効果がありません。 それ以外の場合、cancel
がコールされたときにこのタスクが開始されていない場合、このタスクは実行されません。 タスクがすでに開始されている場合、mayInterruptIfRunning
パラメータにより、このタスク(実装によって既知の場合)を実行しているスレッドがタスクを停止しようとして中断されるかどうかが決まります。このメソッドからの戻り値は、必ずしもタスクが取り消されたかどうかを示すわけではありません。
isCancelled()
を使用します。- パラメータ:
mayInterruptIfRunning
- このタスクを実行するスレッドが(スレッドが実装に認識される場合)を中断する必要がある場合、true
。中断しない場合は、進行中のタスクを完了できます- 戻り値:
- タスクを取り消すことができなかった場合は
false
(通常は完了しているため)、それ以外の場合はtrue
。 2つ以上のスレッドによってタスクが取り消された場合、そのうち少なくとも1つはtrue
を返します。 実装によって、より強力な保証が提供されます。
-
isCancelled
boolean isCancelled()このタスクが正常に完了する前に取り消された場合はtrue
を返します。- 戻り値:
- このタスクが完了する前に取り消された場合は
true
-
isDone
boolean isDone()このタスクが完了した場合はtrue
を返します。 完了の理由は、正常終了、例外、取り消しなどがありますが、いずれの場合もこのメソッドはtrue
を返します。- 戻り値:
- このタスクが完了した場合は
true
-
get
V get() throws InterruptedException, ExecutionException必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。- 戻り値:
- 計算結果
- 例外:
CancellationException
- 計算が取り消された場合ExecutionException
- 計算で例外がスローされた場合InterruptedException
- 待機中に現在のスレッドで割込みが発生した場合
-
get
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。- パラメータ:
timeout
- 待機する最長時間unit
- timeout引数の時間単位- 戻り値:
- 計算結果
- 例外:
CancellationException
- 計算が取り消された場合ExecutionException
- 計算で例外がスローされた場合InterruptedException
- 待機中に現在のスレッドで割込みが発生した場合TimeoutException
- 待機がタイム・アウトになった場合
-
resultNow
default V resultNow()計算された結果を待たずに返します。このメソッドは、タスクがすでに正常に完了していることをコール元が認識する場合に使用します。たとえば、成功したタスクについてFutureオブジェクトのストリームをフィルタ処理し、マッピング演算を使用して結果のストリームを取得する場合などです。
results = futures.stream() .filter(f -> f.state() == Future.State.SUCCESS) .map(Future::resultNow) .toList();
- 実装要件:
- デフォルトの実装では、
isDone()
を起動して、タスクが完了したかどうかをテストします。 完了すると、get()
を起動して結果を取得します。 - 戻り値:
- 計算結果
- 例外:
IllegalStateException
- タスクが完了していないか、タスクが結果とともに完了しなかった場合- 導入されたバージョン:
- 19
-
exceptionNow
default Throwable exceptionNow()待機せずにタスクによってスローされた例外を返します。このメソッドは、タスクがすでに例外で完了していることをコール元が認識している場合に発生します。
- 実装要件:
- デフォルトの実装では、
isDone()
を起動して、タスクが完了したかどうかをテストします。 完了して取り消されない場合、get()
を起動し、ExecutionException
を捕捉して例外を取得します。 - 戻り値:
- タスクによってスローされた例外
- 例外:
IllegalStateException
- タスクが完了していない場合、タスクが正常に完了した場合、またはタスクが取り消された場合- 導入されたバージョン:
- 19
-
state
default Future.State state()計算状態を返します。- 実装要件:
- デフォルトの実装では、
isDone()
、isCancelled()
およびget()
を使用して状態を決定します。 - 戻り値:
- 計算状態
- 導入されたバージョン:
- 19
-