Класс ExecutorCompletionService<V>
- java.lang.Object
-
- java.util.concurrent.ExecutorCompletionService<V>
- Все реализованные интерфейсы:
CompletionService<V>
public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
A 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.
Примеры использования. Предположим, у вас есть набор решателей для определенной задачи, каждый из которых возвращает значение некоторого типа Result, и вы хотите запустить их параллельно, обрабатывая результаты каждого из них, возвращающих не null-значение, в некотором методе 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);
}
} Предположим, что вы хотите использовать первый не null-результат набора задач, игнорируя те, которые сталкиваются с исключениями, и отменяя все остальные задачи, когда первая задача готова: 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);
}
- Since:
- 1.5
Конструкторы
| Конструктор | Описание |
|---|---|
ExecutorCompletionService(Executor executor) |
Создаёт ExecutorCompletionService, используя предоставленный executor для выполнения базовых задач и |
ExecutorCompletionService(Executor executor,
BlockingQueue<Future<V>> completionQueue) |
Создаёт ExecutorCompletionService, используя предоставленный executor для выполнения базовых задач и предоставленную очередь в качестве очереди завершения. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
Future<V> |
submit(Runnable task,
V result) |
Отправляет задачу Runnable на выполнение и возвращает Future, представляющую эту задачу. |
Future<V> |
submit(Callable<V> task) |
Отправляет возвращающую значение задачу на выполнение и возвращает Future, представляющую ожидаемые результаты задачи. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе java.util.concurrent.CompletionService
poll, poll, take
Конструкторы
ExecutorCompletionService
public ExecutorCompletionService(Executor executor)
Создаёт ExecutorCompletionService, используя предоставленный executor для выполнения базовых задач и LinkedBlockingQueue в качестве очереди завершения.
- Параметры:
-
executor- executor для использования - Исключения:
-
NullPointerException- если executornull
ExecutorCompletionService
public ExecutorCompletionService(Executor executor,
BlockingQueue<Future<V>> completionQueue)
Создаёт ExecutorCompletionService, используя предоставленный executor для выполнения базовых задач и предоставленную очередь в качестве очереди завершения.
- Параметры:
-
executor- executor для использования -
completionQueue- очередь для использования в качестве очереди завершения, обычно предназначенной для использования этой службой. Эта очередь рассматривается как неограниченная — неудачные попыткиQueue.addопераций для завершённых задач приводят к тому, что они не могут быть получены. - Исключения:
-
NullPointerException- если executor или completionQueuenull
Методы
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
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ExecutorCompletionService.html