JavaTM Platform
Standard Ed. 6

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

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


コンストラクタの概要
ExecutorCompletionService(Executor executor)
          基本タスクの実行用に指定された executor を使用し、完了キューとして LinkedBlockingQueue を使用して、ExecutorCompletionService を作成します。
ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
          基本タスクの実行用に指定された executor を使用し、完了キューとして指定されたキューを使用して、ExecutorCompletionService を作成します。
 
メソッドの概要
 Future<V> poll()
          次の完了済みタスクを表す Future を取得して削除します。
 Future<V> poll(long timeout, TimeUnit unit)
          次の完了済みタスクを表す Future を取得して削除します。
 Future<V> submit(Callable<V> task)
          値を返す実行用タスクを送信して、保留状態のタスク結果を表す Future を返します。
 Future<V> submit(Runnable task, V result)
          実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。
 Future<V> take()
          次の完了済みタスクを表す 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 - 通常、このサービス専用の完了キューとして使用するキュー
例外:
NullPointerException - executor または completionQueue が null の場合
メソッドの詳細

submit

public Future<V> submit(Callable<V> task)
インタフェース CompletionService の記述:
値を返す実行用タスクを送信して、保留状態のタスク結果を表す Future を返します。完了時に、このタスクを取り出すかポーリングできます。

定義:
インタフェース CompletionService<V> 内の submit
パラメータ:
task - 送信するタスク
戻り値:
タスクの保留完了を表す Future

submit

public Future<V> submit(Runnable task,
                        V result)
インタフェース CompletionService の記述:
実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。完了時に、このタスクを取り出すかポーリングできます。

定義:
インタフェース CompletionService<V> 内の submit
パラメータ:
task - 送信するタスク
result - 正常に完了した場合に返す結果
戻り値:
タスクの保留完了を表す Future。その get() メソッドは、完了時に指定された結果値を返す

take

public Future<V> take()
               throws InterruptedException
インタフェース CompletionService の記述:
次の完了済みタスクを表す Future を取得して削除します。何も存在しない場合は待機します。

定義:
インタフェース CompletionService<V> 内の take
戻り値:
次の完了済みタスクを表す Future
例外:
InterruptedException - 待機中に割り込みが発生した場合

poll

public Future<V> poll()
インタフェース CompletionService の記述:
次の完了済みタスクを表す Future を取得して削除します。何も存在しない場合は null を返します。

定義:
インタフェース CompletionService<V> 内の poll
戻り値:
次の完了済みタスクを表す Future。何も存在しない場合は null

poll

public Future<V> poll(long timeout,
                      TimeUnit unit)
               throws InterruptedException
インタフェース CompletionService の記述:
次の完了済みタスクを表す Future を取得して削除します。何も存在しない場合は、必要に応じて指定された待機時間まで待機します。

定義:
インタフェース CompletionService<V> 内の poll
パラメータ:
timeout - 処理を中止するまでの待機時間。単位は unit
unit - timeout パラメータの解釈方法を決定する TimeUnit
戻り値:
次の完了済みタスクを表す Future。指定された待機時間が経過しても何も存在しない場合は null
例外:
InterruptedException - 待機中に割り込みが発生した場合

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。