java.lang.Object
java.util.concurrent.ExecutorCompletionService<V>
- 类型参数:
-
V
- 该服务的任务产生和消费的值的类型
- 所有已实现的接口:
-
CompletionService<V>
使用提供的
Executor
来执行任务的CompletionService
。该类安排提交的任务在完成后放置在一个队列中,可以使用take
方法访问。该类足够轻量,适合在处理任务组时进行短暂使用。
使用示例。假设您有一组解决某个问题的求解器,每个求解器返回某种类型Result
的值,并且希望并发运行它们,在某个方法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);
}
}
假设您希望使用任务集中的第一个非空结果,忽略遇到异常的任务,并在第一个任务准备就绪时取消所有其他任务:
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);
}
- 自 JDK 版本:
- 1.5
-
Constructor Summary
ConstructorDescriptionExecutorCompletionService
(Executor executor) 使用提供的执行器作为基本任务执行的ExecutorCompletionService,并使用LinkedBlockingQueue
作为完成队列。ExecutorCompletionService
(Executor executor, BlockingQueue<Future<V>> completionQueue) 使用提供的执行器作为基本任务执行的ExecutorCompletionService,并使用提供的队列作为其完成队列。 -
Method Summary
-
Constructor Details
-
ExecutorCompletionService
使用提供的执行器作为基本任务执行的ExecutorCompletionService,并使用LinkedBlockingQueue
作为完成队列。- 参数:
-
executor
- 要使用的执行器 - 抛出:
-
NullPointerException
- 如果执行器为null
-
ExecutorCompletionService
使用提供的执行器作为基本任务执行的ExecutorCompletionService,并使用提供的队列作为其完成队列。- 参数:
-
executor
- 要使用的执行器 -
completionQueue
- 用作完成队列的队列,通常是专门为此服务使用的队列。此队列被视为无界的 -- 对已完成任务的失败尝试Queue.add
操作导致它们无法被检索。 - 抛出:
-
NullPointerException
- 如果执行器或completionQueue为null
-
-
Method Details
-
submit
从接口中复制的描述:CompletionService
提交一个返回值任务以执行,并返回表示任务挂起结果的Future。完成后,可以获取或轮询此任务。- 指定者:
-
submit
在接口CompletionService<V>
- 参数:
-
task
- 要提交的任务 - 返回:
- 表示任务挂起完成的Future
- 抛出:
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为null
-
submit
从接口中复制的描述:CompletionService
提交一个Runnable任务以执行,并返回表示该任务的Future。完成后,可以获取或轮询此任务。- 指定者:
-
submit
在接口CompletionService<V>
- 参数:
-
task
- 要提交的任务 -
result
- 成功完成时要返回的结果 - 返回:
-
表示任务挂起完成的Future,其
get()
方法将在完成时返回给定的结果值 - 抛出:
-
RejectedExecutionException
- 如果无法安排任务执行 -
NullPointerException
- 如果任务为null
-
take
从接口中复制的描述:CompletionService
检索并移除表示下一个已完成任务的Future,如果没有任务存在则等待。- 指定者:
-
take
在接口CompletionService<V>
- 返回:
- 表示下一个已完成任务的Future
- 抛出:
-
InterruptedException
- 如果在等待时被中断
-
poll
从接口中复制的描述:CompletionService
检索并移除表示下一个已完成任务的Future,如果没有任务存在则返回null
。- 指定者:
-
poll
在接口CompletionService<V>
- 返回:
-
表示下一个已完成任务的Future,如果没有任务存在则返回
null
-
poll
从接口中复制的描述:CompletionService
检索并移除表示下一个已完成任务的Future,如果没有任务存在则等待指定的等待时间。- 指定者:
-
poll
在接口CompletionService<V>
- 参数:
-
timeout
- 在unit
单位内等待放弃的时间 -
unit
- 一个TimeUnit
,用于解释timeout
参数 - 返回:
-
表示下一个已完成任务的Future,如果指定的等待时间在任务出现之前过去,则返回
null
- 抛出:
-
InterruptedException
- 如果在等待时被中断
-