Класс 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, 2025, 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/25/docs/api/java.base/java/util/concurrent/ExecutorCompletionService.html