public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
CompletionService
使用提供
Executor
执行任务。这类安排,提交任务,完成后,放置在一个使用
take
队列。该类是轻量级的,足以适合在处理组的任务时使用的瞬态。
使用的例子。假设你有一套特定问题的求解器,每个返回值的一些类型Result
,想同时运行它们,处理它们返回一个非空值,结果,在一些方法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);
}
}
假定您想使用任务组的第一个非零结果,忽略任何遇到的例外,并取消所有其他任务时,第一个是准备:
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);
}
Constructor and Description |
---|
ExecutorCompletionService(Executor executor)
创建使用提供的执行基本任务的执行和
LinkedBlockingQueue 作为完成队列的executorcompletionservice。
|
ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
创建使用提供的执行基本任务的执行和提供的队列为完成队列的executorcompletionservice。
|
Modifier and Type | Method and Description |
---|---|
Future<V> |
poll()
检索并移除的代表未来完成任务以后,或
null 如果不存在。
|
Future<V> |
poll(long timeout, TimeUnit unit)
检索和删除表示下一个已完成的任务的未来,如果需要的话,在指定的等待时间,如果没有的话,等待。
|
Future<V> |
submit(Callable<V> task)
提交一个值返回任务执行,并返回一个表示任务挂起结果的未来。
|
Future<V> |
submit(Runnable task, V result)
提交执行一个Runnable任务并返回一个表示该任务的未来。
|
Future<V> |
take()
检索和删除表示下一个已完成的任务的未来,等待是否还存在。
|
public ExecutorCompletionService(Executor executor)
LinkedBlockingQueue
作为完成队列的executorcompletionservice。
executor
-执行器使用
NullPointerException
-如果是遗嘱执行人
null
public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
executor
-执行器使用
completionQueue
-队列使用使用这个服务专线完成队列通常。这个队列是作为无界——失败的尝试
Queue.add
操作完成的任务使他们不可取。
NullPointerException
如果遗嘱执行人或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
-
TimeUnit
确定如何解释
timeout
参数
null
未来如果指定的等待时间过去之前是
InterruptedException
如果中断等待
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.