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 } |