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を取得して削除します。何も存在しない場合は
null を返します。 |
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を取得して削除します。何も存在しない場合は待機します。
|
public ExecutorCompletionService(Executor executor)
LinkedBlockingQueue
を使用して、ExecutorCompletionServiceを作成します。executor
- 使用するexecutorNullPointerException
- executorがnull
の場合public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
executor
- 使用するexecutorcompletionQueue
- 完了キューとして使用するキュー(通常は、このサービス専用に使用される)。このキューは、アンバウンド形式として扱われます。完了したタスクに対するQueue.add
オペレーションの試行に失敗すると、それらのタスクが取得できなくなります。NullPointerException
- executorまたはcompletionQueueがnull
の場合public Future<V> submit(Callable<V> task)
CompletionService
submit
、インタフェース: CompletionService<V>
task
- 送信するタスクpublic Future<V> submit(Runnable task, V result)
CompletionService
submit
、インタフェース: CompletionService<V>
task
- 送信するタスクresult
- 正常に完了した場合に返す結果get()
メソッドは、完了時に指定された結果値を返しますpublic Future<V> take() throws InterruptedException
CompletionService
take
、インタフェース: CompletionService<V>
InterruptedException
- 待機中に割込みが発生した場合public Future<V> poll()
CompletionService
null
を返します。poll
、インタフェース: CompletionService<V>
null
public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException
CompletionService
poll
、インタフェース: CompletionService<V>
timeout
- 処理を中止するまでの待機時間。単位はunit
unit
- timeout
パラメータの解釈方法を決定するTimeUnit
null
InterruptedException
- 待機中に割込みが発生した場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.