CompletionService that uses a supplied Executor
to execute tasks. This class arranges that submitted tasks are,
upon completion, placed on a queue accessible using take.
The class is lightweight enough to be suitable for transient use
when processing groups of tasks.
Usage Examples.
Suppose you have a set of solvers for a certain problem, each
returning a value of some type Result, and would like to
run them concurrently, processing the results of each of them that
return a non-null value, in some method use(Result r). You
could write this as:
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);
}
}
Suppose instead that you would like to use the first non-null result
of the set of tasks, ignoring any that encounter exceptions,
and cancelling all other tasks when the first one is ready:
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);
}
| Modifier and Type | Class and Description |
|---|---|
| private static class |
| Modifier and Type | Field and Description |
|---|---|
| private final AbstractExecutorService | |
| private final BlockingQueue | |
| private final Executor |
| Access | Constructor and Description |
|---|---|
| public | ExecutorCompletionService(Executor
the executor to use executor)Creates an ExecutorCompletionService using the supplied
executor for base task execution and a
|
| public | ExecutorCompletionService(Executor
the executor to use executor, BlockingQueue<Future<V>> the queue to use as the completion queue
normally one dedicated for use by this service. This
queue is treated as unbounded -- failed attempted
completionQueue)Queue.add operations for completed tasks cause
them not to be retrievable.Creates an ExecutorCompletionService using the supplied executor for base task execution and the supplied queue as its completion queue. |
| Modifier and Type | Method and Description |
|---|---|
| private RunnableFuture | |
| private RunnableFuture | |
| public Future | poll()
Implements java. Retrieves and removes the Future representing the next
completed task, or |
| public Future | poll(long timeout, TimeUnit unit)
Implements java. Retrieves and removes the Future representing the next completed task, waiting if necessary up to the specified wait time if none are yet present. |
| public Future | submit(Callable<V> task)
Implements java. Submits a value-returning task for execution and returns a Future representing the pending results of the task. |
| public Future | submit(Runnable task, V result)
Implements java. Submits a Runnable task for execution and returns a Future representing that task. |
| public Future | take()
Implements java. Retrieves and removes the Future representing the next completed task, waiting if none are yet present. |
| aes | back to summary |
|---|---|
| private final AbstractExecutorService aes | |
| completionQueue | back to summary |
|---|---|
| private final BlockingQueue<Future<V>> completionQueue | |
| executor | back to summary |
|---|---|
| private final Executor executor | |
| ExecutorCompletionService | back to summary |
|---|---|
| public ExecutorCompletionService(Executor executor) Creates an ExecutorCompletionService using the supplied
executor for base task execution and a
| |
| ExecutorCompletionService | back to summary |
|---|---|
| public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue) Creates an ExecutorCompletionService using the supplied executor for base task execution and the supplied queue as its completion queue.
| |
| newTaskFor | back to summary |
|---|---|
| private RunnableFuture | |
| newTaskFor | back to summary |
|---|---|
| private RunnableFuture | |
| poll | back to summary |
|---|---|
| public Future Implements java. Doc from java. Retrieves and removes the Future representing the next
completed task, or | |
| poll | back to summary |
|---|---|
| public Future Implements java. Doc from java. Retrieves and removes the Future representing the next completed task, waiting if necessary up to the specified wait time if none are yet present.
| |
| submit | back to summary |
|---|---|
| public Future Implements java. Doc from java. Submits a value-returning task for execution and returns a Future representing the pending results of the task. Upon completion, this task may be taken or polled.
| |
| submit | back to summary |
|---|---|
| public Future Implements java. Doc from java. Submits a Runnable task for execution and returns a Future representing that task. Upon completion, this task may be taken or polled.
| |
| take | back to summary |
|---|---|
| public Future Implements java. Doc from java. Retrieves and removes the Future representing the next completed task, waiting if none are yet present.
| |
| Modifier and Type | Field and Description |
|---|---|
| private final BlockingQueue | |
| private final Future |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| protected void | done()
Overrides java. Protected method invoked when this task transitions to state
|
| completionQueue | back to summary |
|---|---|
| private final BlockingQueue<Future<V>> completionQueue | |
| task | back to summary |
|---|---|
| private final Future<V> task | |
| QueueingFuture | back to summary |
|---|---|
| pack-priv QueueingFuture(RunnableFuture<V> task, BlockingQueue<Future<V>> completionQueue) | |
| done | back to summary |
|---|---|
| protected void done() Overrides java. Doc from java. Protected method invoked when this task transitions to state
| |