模块  java.base
软件包  java.util.concurrent

Class ExecutorCompletionService<V>

  • 实现的所有接口
    CompletionService<V>

    public class ExecutorCompletionService<V>extends Objectimplements CompletionService<V>
    CompletionService ,它使用提供的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); } } 
    相反,假设您希望使用任务集的第一个非null结果,忽略任何遇到异常,并在第一个任务准备就绪时取消所有其他任务:
       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
    • 构造方法详细信息

      • 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