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);
}
クラス 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
- 使用する executorcompletionQueue
- 通常、このサービス専用の完了キューとして使用するキュー
- 例外:
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
- 処理を中止するまでの待機時間。単位は unitunit
- timeout パラメータの解釈方法を指定する TimeUnit
- 戻り値:
- 次の完了済みタスクを表す Future。指定された待機時間が経過しても何も存在しない場合は null
- 例外:
InterruptedException
- 待機中に割り込みが発生した場合
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。