< prev index next >

src/java.base/share/classes/java/util/concurrent/ExecutorCompletionService.java

Print this page




  80  *   List<Future<Result>> futures = new ArrayList<>(n);
  81  *   Result result = null;
  82  *   try {
  83  *     solvers.forEach(solver -> futures.add(cs.submit(solver)));
  84  *     for (int i = n; i > 0; i--) {
  85  *       try {
  86  *         Result r = cs.take().get();
  87  *         if (r != null) {
  88  *           result = r;
  89  *           break;
  90  *         }
  91  *       } catch (ExecutionException ignore) {}
  92  *     }
  93  *   } finally {
  94  *     futures.forEach(future -> future.cancel(true));
  95  *   }
  96  *
  97  *   if (result != null)
  98  *     use(result);
  99  * }}</pre>


 100  */
 101 public class ExecutorCompletionService<V> implements CompletionService<V> {
 102     private final Executor executor;
 103     private final AbstractExecutorService aes;
 104     private final BlockingQueue<Future<V>> completionQueue;
 105 
 106     /**
 107      * FutureTask extension to enqueue upon completion.
 108      */
 109     private static class QueueingFuture<V> extends FutureTask<Void> {
 110         QueueingFuture(RunnableFuture<V> task,
 111                        BlockingQueue<Future<V>> completionQueue) {
 112             super(task, null);
 113             this.task = task;
 114             this.completionQueue = completionQueue;
 115         }
 116         private final Future<V> task;
 117         private final BlockingQueue<Future<V>> completionQueue;
 118         protected void done() { completionQueue.add(task); }
 119     }




  80  *   List<Future<Result>> futures = new ArrayList<>(n);
  81  *   Result result = null;
  82  *   try {
  83  *     solvers.forEach(solver -> futures.add(cs.submit(solver)));
  84  *     for (int i = n; i > 0; i--) {
  85  *       try {
  86  *         Result r = cs.take().get();
  87  *         if (r != null) {
  88  *           result = r;
  89  *           break;
  90  *         }
  91  *       } catch (ExecutionException ignore) {}
  92  *     }
  93  *   } finally {
  94  *     futures.forEach(future -> future.cancel(true));
  95  *   }
  96  *
  97  *   if (result != null)
  98  *     use(result);
  99  * }}</pre>
 100  *
 101  * @since 1.5
 102  */
 103 public class ExecutorCompletionService<V> implements CompletionService<V> {
 104     private final Executor executor;
 105     private final AbstractExecutorService aes;
 106     private final BlockingQueue<Future<V>> completionQueue;
 107 
 108     /**
 109      * FutureTask extension to enqueue upon completion.
 110      */
 111     private static class QueueingFuture<V> extends FutureTask<Void> {
 112         QueueingFuture(RunnableFuture<V> task,
 113                        BlockingQueue<Future<V>> completionQueue) {
 114             super(task, null);
 115             this.task = task;
 116             this.completionQueue = completionQueue;
 117         }
 118         private final Future<V> task;
 119         private final BlockingQueue<Future<V>> completionQueue;
 120         protected void done() { completionQueue.add(task); }
 121     }


< prev index next >