モジュール 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
関連項目:
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型
    インタフェース
    説明
    static enum 
    計算状態を表します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    boolean
    cancel(boolean mayInterruptIfRunning)
    このタスクの実行の取消しを試みます。
    default Throwable
    待機せずにタスクによってスローされた例外を返します。
    get()
    必要に応じて計算が完了するまで待機し、その後、計算結果を取得します。
    get(long timeout, TimeUnit unit)
    必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。
    boolean
    このタスクが正常に完了する前に取り消された場合はtrueを返します。
    boolean
    このタスクが完了した場合はtrueを返します。
    default V
    計算された結果を待たずに返します。
    default Future.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

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

      必要に応じて、最大で指定された時間、計算が完了するまで待機し、その後、計算結果が利用可能な場合は結果を取得します。
      パラメータ:
      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