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

クラスExecutorCompletionService<V>

java.lang.Object
java.util.concurrent.ExecutorCompletionService<V>
すべての実装されたインタフェース:
CompletionService<V>

public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
タスクの実行に、指定されたExecutorを使用するCompletionServiceです。 このクラスは、送信されたタスクが完了時に、takeを使用してアクセス可能なキューに配置されるように調整します。 このクラスは軽量であるため、タスク・グループを処理する際に一時的に使用できます。

使用例 それぞれが何らかのResult型の値を返す、特定の問題のためのソルバーのセットがあり、それらを同時に実行して、null以外の値を返す各ソルバーの結果を何らかのuse(Result r)メソッドで処理する場合を考えてみます。 次のように記述することができます。

 
 void solve(Executor e,
            Collection<Callable<Result>> solvers)
     throws InterruptedException, ExecutionException {
   CompletionService<Result> cs
       = new ExecutorCompletionService<>(e);
   solvers.forEach(cs::submit);
   for (int i = solvers.size(); i > 0; i--) {
     Result r = cs.take().get();
     if (r != null)
       use(r);
   }
 }
今度は、例外が発生した結果を無視して、タスク・セットのnull以外の最初の結果を使用する場合を考えます。有効な最初の結果を取得できたら、ほかのタスクはすべて取り消します。
 
 void solve(Executor e,
            Collection<Callable<Result>> solvers)
     throws InterruptedException {
   CompletionService<Result> cs
       = new ExecutorCompletionService<>(e);
   int n = solvers.size();
   List<Future<Result>> futures = new ArrayList<>(n);
   Result result = null;
   try {
     solvers.forEach(solver -> futures.add(cs.submit(solver)));
     for (int i = n; i > 0; i--) {
       try {
         Result r = cs.take().get();
         if (r != null) {
           result = r;
           break;
         }
       } catch (ExecutionException ignore) {}
     }
   } finally {
     futures.forEach(future -> future.cancel(true));
   }

   if (result != null)
     use(result);
 }

導入されたバージョン:
1.5
  • コンストラクタのサマリー

    コンストラクタ
    コンストラクタ
    説明
    基本タスクの実行用に指定されたexecutorを使用し、完了キューとしてLinkedBlockingQueueを使用して、ExecutorCompletionServiceを作成します。
    基本タスクの実行用に指定されたexecutorを使用し、完了キューとして指定されたキューを使用して、ExecutorCompletionServiceを作成します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合はnullを返します。
    poll(long timeout, TimeUnit unit)
    次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合は、必要に応じて指定された待機時間まで待機します。
    submit(Runnable task, V result)
    実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。
    submit(Callable<V> task)
    値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。
    次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合は待機します。

    クラス java.lang.Objectで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • コンストラクタの詳細

    • ExecutorCompletionService

      public ExecutorCompletionService(Executor executor)
      基本タスクの実行用に指定されたexecutorを使用し、完了キューとしてLinkedBlockingQueueを使用して、ExecutorCompletionServiceを作成します。
      パラメータ:
      executor - 使用するexecutor
      例外:
      NullPointerException - executorがnullの場合
    • ExecutorCompletionService

      public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
      基本タスクの実行用に指定されたexecutorを使用し、完了キューとして指定されたキューを使用して、ExecutorCompletionServiceを作成します。
      パラメータ:
      executor - 使用するexecutor
      completionQueue - 完了キューとして使用するキュー(通常は、このサービス専用に使用される)。 このキューは、アンバウンド形式として扱われます。完了したタスクに対するQueue.addオペレーションの試行に失敗すると、それらのタスクが取得できなくなります。
      例外:
      NullPointerException - executorまたはcompletionQueueがnullの場合
  • メソッドの詳細

    • submit

      public Future<V> submit(Callable<V> task)
      インタフェースからコピーされた説明: CompletionService
      値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。 完了時に、このタスクを取り出すかポーリングできます。
      定義:
      submit、インタフェースCompletionService<V>
      パラメータ:
      task - 送信するタスク
      戻り値:
      タスクの保留完了を表すFuture
      例外:
      RejectedExecutionException - タスクの実行をスケジュールできない場合
      NullPointerException - タスクがnullの場合
    • submit

      public Future<V> submit(Runnable task, V result)
      インタフェースからコピーされた説明: CompletionService
      実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 完了時に、このタスクを取り出すかポーリングできます。
      定義:
      submit、インタフェースCompletionService<V>
      パラメータ:
      task - 送信するタスク
      result - 正常に完了した場合に返す結果
      戻り値:
      タスクの保留完了を表すFuture。そのget()メソッドは、完了時に指定された結果値を返します
      例外:
      RejectedExecutionException - タスクの実行をスケジュールできない場合
      NullPointerException - タスクがnullの場合
    • take

      public Future<V> take() throws InterruptedException
      インタフェースからコピーされた説明: CompletionService
      次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合は待機します。
      定義:
      take、インタフェースCompletionService<V>
      戻り値:
      次の完了済みタスクを表すFuture
      例外:
      InterruptedException - 待機中に割込みが発生した場合
    • poll

      public Future<V> poll()
      インタフェースからコピーされた説明: CompletionService
      次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合はnullを返します。
      定義:
      poll、インタフェースCompletionService<V>
      戻り値:
      次の完了済みタスクを表すFuture。何も存在しない場合はnull
    • poll

      public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException
      インタフェースからコピーされた説明: CompletionService
      次の完了済みタスクを表すFutureを取得して削除します。何も存在しない場合は、必要に応じて指定された待機時間まで待機します。
      定義:
      poll、インタフェースCompletionService<V>
      パラメータ:
      timeout - 処理を中止するまでの待機時間。単位はunit
      unit - timeoutパラメータの解釈方法を決定するTimeUnit
      戻り値:
      次の完了済みタスクを表すFuture。指定された待機時間が経過しても何も存在しない場合はnull
      例外:
      InterruptedException - 待機中に割込みが発生した場合