Класс ExecutorCompletionService<V>
- Параметры типа:
-
V- тип значений, которые задачи этой службы производят и потребляют
- Все реализуемые интерфейсы:
CompletionService<V>
public class ExecutorCompletionService<V> extends Object implements CompletionService<V>
CompletionService), которая использует предоставленный Executor для выполнения задач. Этот класс организует размещение завершенных задач в очереди, доступной с помощью 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);
}
- С момента:
- 1.5
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ExecutorCompletionService |
Создает ExecutorCompletionService, используя предоставленный executor для базового выполнения задач и LinkedBlockingQueue в качестве очереди завершения. |
ExecutorCompletionService |
Создает ExecutorCompletionService, используя предоставленный executor для базового выполнения задач и предоставленную очередь в качестве очереди завершения. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Future |
poll() |
Получает и удаляет Future, представляющую следующую завершенную задачу, или null если таких нет. |
Future |
poll |
Получает и удаляет Future, представляющую следующую завершенную задачу, ожидая, если необходимо, до указанного времени ожидания, если таких еще нет. |
Future |
submit |
Отправляет задачу Runnable на выполнение и возвращает Future, представляющую эту задачу. |
Future |
submit |
Отправляет задачу, возвращающую значение, на выполнение и возвращает Future, представляющую ожидаемые результаты задачи. |
Future |
take() |
Получает и удаляет Future, представляющую следующую завершенную задачу, ожидая, если таких еще нет. |
Подробное описание конструкторов
ExecutorCompletionService
public ExecutorCompletionService(Executor executor)
LinkedBlockingQueue в качестве очереди завершения.- Параметры:
-
executor- executor для использования - Исключения:
-
NullPointerException- если executor являетсяnull
ExecutorCompletionService
public ExecutorCompletionService(Executor executor, BlockingQueue<Future<V>> completionQueue)
- Параметры:
-
executor- executor для использования -
completionQueue- очередь для использования в качестве очереди завершения, обычно предназначенная для использования этой службой. Эта очередь рассматривается как неограниченная — неудачные попыткиQueue.addопераций для завершенных задач приводят к тому, что они не могут быть получены. - Исключения:
-
NullPointerException- если executor или completionQueue являютсяnull
Подробное описание методов
submit
public Future<V> submit(Callable<V> task)
CompletionService- Задано:
-
submitв интерфейсеCompletionService<V> - Параметры:
-
task- отправляемая задача - Возвращает:
- Future, представляющая ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задача не может быть запланирована на выполнение -
NullPointerException- если задача null
submit
public Future<V> submit(Runnable task, V result)
CompletionService- Задано:
-
submitв интерфейсеCompletionService<V> - Параметры:
-
task- отправляемая задача -
result- результат, который нужно вернуть при успешном завершении - Возвращает:
- Future, представляющая ожидаемое завершение задачи, и метод
get()которой вернет данное значение результата после завершения - Исключения:
-
RejectedExecutionException- если задача не может быть запланирована на выполнение -
NullPointerException- если задача null
take
public Future<V> take() throws InterruptedException
CompletionService- Задано:
-
takeв интерфейсеCompletionService<V> - Возвращает:
- Future, представляющая следующую завершенную задачу
- Исключения:
-
InterruptedException- если прервано во время ожидания
poll
public Future<V> poll()
CompletionServicenull если таковых нет.- Задано:
-
pollв интерфейсеCompletionService<V> - Возвращает:
- Future, представляющая следующую завершенную задачу, или
nullесли таковых нет
poll
public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException
CompletionService- Задано:
-
pollв интерфейсеCompletionService<V> - Параметры:
-
timeout- время ожидания до отказа, в единицахunit -
unit-TimeUnitопределяющий, как интерпретировать параметрtimeout - Возвращает:
- Future, представляющая следующую завершенную задачу, или
nullесли указанное время ожидания истекло, прежде чем какая-либо появится - Исключения:
-
InterruptedException- если прервано во время ожидания
© 1993, 2023, 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/21/docs/api/java.base/java/util/concurrent/ExecutorCompletionService.html