モジュール java.base
パッケージ java.util.concurrent

インタフェースFuture<V>

型パラメータ:
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
関連項目:
FutureTask, Executor
  • メソッドのサマリー

    修飾子と型 メソッド 説明
    boolean cancel​(boolean mayInterruptIfRunning)
    このタスクの実行の取消しを試みます。
    V get()
    必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。
    V get​(long timeout, TimeUnit unit)
    必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。
    boolean isCancelled()
    このタスクが正常に完了する前に取り消された場合はtrueを返します。
    boolean isDone()
    このタスクが完了した場合はtrueを返します。
  • メソッドの詳細

    • cancel

      boolean cancel​(boolean mayInterruptIfRunning)
      このタスクの実行の取消しを試みます。 タスクがすでに完了していた場合、すでに取り消されていた場合、またはその他の理由で取消しできなかった場合、この試みは失敗します。 その試みが成功し、cancelの呼出し時にこのタスクが起動しなかった場合、このタスクが実行されることはありません。 タスクが起動済みの場合は、このタスクの停止を試みる際、このタスクを実行しているスレッドに割り込む必要があるかどうかは、mayInterruptIfRunningパラメータで判断します。

      このメソッドが復帰すると、その後のisDone()の呼出しは常にtrueを返します。 このメソッドがtrueを返した場合、後続のisCancelled()の呼出しは常にtrueを返します。

      パラメータ:
      mayInterruptIfRunning - このタスクを実行しているスレッドに割り込む必要がある場合はtrue、そうでない場合は、実行中のタスクを完了できる
      戻り値:
      タスクを取り消せなかった場合はfalse (通常はタスクがすでに正常に完了していたため)、そうでない場合はtrue
    • isCancelled

      boolean isCancelled()
      このタスクが正常に完了する前に取り消された場合はtrueを返します。
      戻り値:
      このタスクが完了する前に取り消された場合はtrue
    • isDone

      boolean isDone()
      このタスクが完了した場合はtrueを返します。 完了の理由は、正常終了、例外、取り消しなどがありますが、いずれの場合もこのメソッドはtrueを返します。
      戻り値:
      このタスクが完了した場合はtrue
    • get

      必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。
      戻り値:
      計算結果
      例外:
      CancellationException - 計算が取り消された場合
      ExecutionException - 計算で例外がスローされた場合
      InterruptedException - 待機中に現在のスレッドで割込みが発生した場合
    • get

      V get​(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
      必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。
      パラメータ:
      timeout - 待機する最長時間
      unit - timeout引数の時間単位
      戻り値:
      計算結果
      例外:
      CancellationException - 計算が取り消された場合
      ExecutionException - 計算で例外がスローされた場合
      InterruptedException - 待機中に現在のスレッドで割込みが発生した場合
      TimeoutException - 待機がタイム・アウトになった場合