Module  java.base
软件包  java.util.concurrent

Class ExecutorCompletionService<V>

  • All Implemented Interfaces:
    CompletionService<V>


    public class ExecutorCompletionService<V>
    extends Object
    implements CompletionService<V>
    A 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); } } 
    假设您希望使用该组任务的第一个非空结果,忽略遇到任何异常,并在第一个准备就绪时取消所有其他任务:
       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
    • 方法详细信息

      • 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()方法将在完成后返回给定的结果值
      • 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 - a TimeUnit确定如何解释 timeout参数
        结果
        未来代表下一个完成的任务或 null如果指定的等待时间过去之前存在
        异常
        InterruptedException - 如果在等待时中断