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)
使用提供的执行程序创建一个ExecutorCompletionService来执行基本任务,一个 LinkedBlockingQueue 作为完成队列。
|
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。
|
Future<V> |
submit(Runnable task, V result)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
|
Future<V> |
take()
检索并删除代表下一个完成任务的未来,等待是否还没有任务。
|
public ExecutorCompletionService(Executor executor)
LinkedBlockingQueue
作为完成队列。
executor
- 执行者使用
NullPointerException
- 如果执行者是
null
public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
executor
- 执行者使用
completionQueue
- 用作完成队列的队列通常用于此服务使用。
此队列被视为无界-失败的尝试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
- a
TimeUnit
确定如何解释
timeout
参数
null
如果指定的等待时间在一个存在之前经过
InterruptedException
- if interrupted while waiting