- java.lang.Object
-
- java.util.concurrent.ExecutorCompletionService<V>
-
- All Implemented Interfaces:
-
CompletionService<V>
public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
ACompletionService
使用提供的Executor
执行任务。 此类安排提交的任务完成后,可以使用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); }
- 从以下版本开始:
- 1.5
-
-
构造方法摘要
构造方法 Constructor 描述 ExecutorCompletionService(Executor executor)
使用提供的执行程序创建一个ExecutorCompletionService,用于执行基本任务,一个LinkedBlockingQueue
作为完成队列。ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
使用提供的执行程序创建一个ExecutorCompletionService,用于执行基本任务,并将提供的队列作为其完成队列。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 Future<V>
poll()
检索并删除代表下一个完成的任务的未来,或者如果没有,任务将null
。Future<V>
poll(long timeout, TimeUnit unit)
检索并删除表示下一个完成的任务的未来,如果还没有,则等待必要时直到指定的等待时间。Future<V>
submit(Runnable task, V result)
提交一个可运行的任务执行,并返回一个表示该任务的未来。Future<V>
submit(Callable<V> task)
提交值返回任务以执行,并返回代表任务待处理结果的Future。Future<V>
take()
检索并删除代表下一个完成任务的未来,等待是否还没有任务。
-
-
-
构造方法详细信息
-
ExecutorCompletionService
public ExecutorCompletionService(Executor executor)
使用提供的执行程序创建一个ExecutorCompletionService来执行基本任务,一个LinkedBlockingQueue
作为完成队列。- 参数
-
executor
- 执行者使用 - 异常
-
NullPointerException
- 如果执行人是null
-
ExecutorCompletionService
public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
使用提供的执行程序创建一个ExecutorCompletionService,用于执行基本任务,并将提供的队列作为其完成队列。- 参数
-
executor
- 执行者使用 -
completionQueue
- 用作完成队列的队列通常由该服务专用。 该队列被视为无限制的尝试Queue.add
完成的任务的操作导致它们不可检索。 - 异常
-
NullPointerException
- 如果executor或completionQueue是null
-
-
方法详细信息
-
submit
public Future<V> submit(Callable<V> task)
说明从接口CompletionService
复制提交值返回任务以执行,并返回代表任务待处理结果的Future。 完成后,可以采取或轮询此任务。- Specified by:
-
submit
在接口CompletionService<V>
- 参数
-
task
- 要提交的任务 - 结果
- 一个未来的代表,待完成任务
-
submit
public Future<V> submit(Runnable task, V result)
说明从界面CompletionService
复制提交一个可运行的任务执行,并返回一个表示该任务的未来。 完成后,可以采取或轮询此任务。- Specified by:
-
submit
在接口CompletionService<V>
- 参数
-
task
- 要提交的任务 -
result
- 成功完成后返回的结果 - 结果
-
未来任务的完成,其
get()
方法将在完成后返回给定的结果值
-
take
public Future<V> take() throws InterruptedException
说明从界面CompletionService
复制检索并删除代表下一个完成任务的未来,等待是否还没有任务。- Specified by:
-
take
在接口CompletionService<V>
- 结果
- 未来代表下一个完成的任务
- 异常
-
InterruptedException
- 如果在等待时中断
-
poll
public Future<V> poll()
说明从界面CompletionService
复制检索并删除代表下一个完成的任务的未来,或者如果没有的话,则null
。- Specified by:
-
poll
在接口CompletionService<V>
- 结果
-
未来代表下一个完成的任务,或
null
如果没有)
-
poll
public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException
说明从接口CompletionService
复制检索并删除表示下一个完成的任务的未来,如果还没有,则等待必要时直到指定的等待时间。- Specified by:
-
poll
在接口CompletionService<V>
- 参数
-
timeout
- 放弃之前等待多长时间,以unit
为单位 -
unit
- aTimeUnit
确定如何解释timeout
参数 - 结果
-
未来代表下一个完成的任务或
null
如果指定的等待时间过去之前存在 - 异常
-
InterruptedException
- 如果在等待时中断
-
-