モジュール java.base
パッケージ 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
    • コンストラクタのサマリー

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

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

      • 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
      • submit

        public Future<V> submit​(Runnable task,
                                V result)
        インタフェースからコピーされた説明: CompletionService
        実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 完了時に、このタスクを取り出すかポーリングできます。
        定義:
        submit、インタフェース: CompletionService<V>
        パラメータ:
        task - 送信するタスク
        result - 正常に完了した場合に返す結果
        戻り値:
        タスクの保留完了を表すFuture。そのget()メソッドは、完了時に指定された結果値を返します
      • 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 - 待機中に割込みが発生した場合