Module java.base

Class ExecutorCompletionService<V>

java.lang.Object
java.util.concurrent.ExecutorCompletionService<V>
类型参数:
V - 该服务的任务产生和消费的值的类型
所有已实现的接口:
CompletionService<V>

public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
使用提供的Executor来执行任务的CompletionService。该类安排提交的任务在完成后放置在一个队列中,可以使用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);
 }
自 JDK 版本:
1.5
  • Constructor Details

    • 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 - 如果执行器或completionQueue为null
  • Method Details

    • submit

      public Future<V> submit(Callable<V> task)
      从接口中复制的描述: CompletionService
      提交一个返回值任务以执行,并返回表示任务挂起结果的Future。完成后,可以获取或轮询此任务。
      指定者:
      submit 在接口 CompletionService<V>
      参数:
      task - 要提交的任务
      返回:
      表示任务挂起完成的Future
      抛出:
      RejectedExecutionException - 如果无法安排任务执行
      NullPointerException - 如果任务为null
    • submit

      public Future<V> submit(Runnable task, V result)
      从接口中复制的描述: CompletionService
      提交一个Runnable任务以执行,并返回表示该任务的Future。完成后,可以获取或轮询此任务。
      指定者:
      submit 在接口 CompletionService<V>
      参数:
      task - 要提交的任务
      result - 成功完成时要返回的结果
      返回:
      表示任务挂起完成的Future,其get()方法将在完成时返回给定的结果值
      抛出:
      RejectedExecutionException - 如果无法安排任务执行
      NullPointerException - 如果任务为null
    • take

      public Future<V> take() throws InterruptedException
      从接口中复制的描述: CompletionService
      检索并移除表示下一个已完成任务的Future,如果没有任务存在则等待。
      指定者:
      take 在接口 CompletionService<V>
      返回:
      表示下一个已完成任务的Future
      抛出:
      InterruptedException - 如果在等待时被中断
    • poll

      public Future<V> poll()
      从接口中复制的描述: CompletionService
      检索并移除表示下一个已完成任务的Future,如果没有任务存在则返回null
      指定者:
      poll 在接口 CompletionService<V>
      返回:
      表示下一个已完成任务的Future,如果没有任务存在则返回null
    • poll

      public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException
      从接口中复制的描述: CompletionService
      检索并移除表示下一个已完成任务的Future,如果没有任务存在则等待指定的等待时间。
      指定者:
      poll 在接口 CompletionService<V>
      参数:
      timeout - 在unit单位内等待放弃的时间
      unit - 一个TimeUnit,用于解释timeout参数
      返回:
      表示下一个已完成任务的Future,如果指定的等待时间在任务出现之前过去,则返回null
      抛出:
      InterruptedException - 如果在等待时被中断