Интерфейс ExecutorService
- Все суперинтерфейсы:
-
AutoCloseable,Executor
- Все известные подинтерфейсы:
ScheduledExecutorService
- Все известные реализующие классы:
-
AbstractExecutorService,ForkJoinPool,ScheduledThreadPoolExecutor,ThreadPoolExecutor
public interface ExecutorService extends Executor, AutoCloseable
Executor, предоставляющий методы для управления завершением и методы, которые могут создавать Future для отслеживания выполнения одной или нескольких асинхронных задач. Объект ExecutorService может быть остановлен, что приведет к отклонению новых задач. Для остановки объекта ExecutorService предоставляются два разных метода. Метод shutdown() позволит ранее отправленным задачам завершиться, прежде чем произойдёт завершение, а метод shutdownNow() предотвратит запуск ожидающих задач и попытается остановить выполняющиеся в данный момент. После завершения работы исполнителя нет активных задач, нет ожидающих задач и новые задачи не могут быть отправлены. Неиспользуемый ExecutorService должен быть остановлен для освобождения ресурсов.
Метод submit расширяет базовый метод Executor.execute(Runnable), создавая и возвращая Future, который может быть использован для отмены выполнения и/или ожидания завершения. Методы invokeAny и invokeAll выполняют наиболее полезные формы массового выполнения, выполняя коллекцию задач и ожидая завершения по крайней мере одной или всех задач. (Класс ExecutorCompletionService может быть использован для написания настраиваемых вариантов этих методов.)
Класс Executors предоставляет фабричные методы для служб исполнителей, предоставляемых в этом пакете.
Примеры использования
Вот набросок сетевой службы, в которой потоки в пуле потоков обслуживают входящие запросы. Используется предварительно настроенный метод фабрикиExecutors.newFixedThreadPool(int):
class NetworkService implements Runnable {
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)
throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
}
public void run() { // run the service
try {
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
class Handler implements Runnable {
private final Socket socket;
Handler(Socket socket) { this.socket = socket; }
public void run() {
// read and service request on socket
}
} Также можно создать и закрыть (остановить, блокируя до завершения) объект ExecutorService, проиллюстрировав это другим методом фабрики Executors:
try (ExecutorService e = Executors.newWorkStealingPool()) {
// submit or execute many tasks with e ...
} Также возможна дальнейшая настройка. Например, следующий метод останавливает объект ExecutorService в две фазы, сначала отклоняя входящие задачи, вызывая shutdown, а затем, при необходимости, отменяя любые оставшиеся задачи, вызывая shutdownNow:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ex) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
} Эффекты согласованности памяти: Действия в потоке до отправки задачи Runnable или Callable в объект ExecutorService предшествуют любым действиям, выполняемым этой задачей, которые, в свою очередь, предшествуют получению результата через Future.get().
- С момента:
- 1.5
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
awaitTermination |
Блокирует до завершения всех задач после запроса на остановку, или истечения таймаута, или прерывания текущего потока, что произойдет первым. |
default void |
close() |
Инициирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются. |
<T> List |
invokeAll |
Выполняет заданные задачи, возвращая список Future, содержащий их статус и результаты, когда все завершены. |
<T> List |
invokeAll |
Выполняет заданные задачи, возвращая список Future, содержащий их статус и результаты, когда все завершены или истекает таймаут, что произойдет первым. |
<T> T |
invokeAny |
Выполняет заданные задачи, возвращая результат одной, которая завершилась успешно (т. е. без исключений), если таковые имеются. |
<T> T |
invokeAny |
Выполняет заданные задачи, возвращая результат одной, которая завершилась успешно (т. е. без исключений), если таковые имеются, прежде чем истечет заданный таймаут. |
boolean |
isShutdown() |
Возвращает true, если этот исполнитель был остановлен. |
boolean |
isTerminated() |
Возвращает true, если все задачи завершились после остановки. |
void |
shutdown() |
Инициирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются. |
List |
shutdownNow() |
Пытается остановить все активно выполняющиеся задачи, приостанавливает обработку ожидающих задач и возвращает список задач, которые ожидали выполнения. |
Future |
submit |
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future |
submit |
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future |
submit |
Отправляет задачу, возвращающую значение, для выполнения и возвращает Future, представляющую ожидаемые результаты задачи. |
Подробное описание методов
shutdown
void shutdown()
Этот метод не ждет завершения выполнения ранее отправленных задач. Используйте awaitTermination для этого.
shutdownNow
List<Runnable> shutdownNow()
Этот метод не ждет завершения активно выполняющихся задач. Используйте awaitTermination для этого.
Нет гарантий, кроме наилучших усилий по остановке обработки активно выполняющихся задач. Например, типичные реализации отменят задачу через Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
- Возвращает:
- список задач, которые никогда не начинали выполнение
isShutdown
boolean isShutdown()
true, если данный исполняющий поток был остановлен.- Возвращает:
-
true, если данный исполняющий поток был остановлен
isTerminated
boolean isTerminated()
true, если все задачи завершены после завершения работы. Обратите внимание, что isTerminated никогда не true, если не был вызван либо shutdown, либо shutdownNow.- Возвращает:
-
true, если все задачи завершены после завершения работы
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
- Параметры:
-
timeout- максимальное время ожидания -
unit- единица измерения времени аргумента времени ожидания - Возвращает:
-
true, если данный executor завершился иfalse, если время ожидания истекло до завершения - Исключения:
-
InterruptedException- если поток прерван во время ожидания
submit
<T> Future<T> submit(Callable<T> task)
get вернёт результат задачи при успешном завершении. Если вы хотите немедленно заблокировать ожидание задачи, вы можете использовать конструкции вида result = exec.submit(aCallable).get();
Примечание: класс Executors содержит набор методов, которые могут преобразовать некоторые другие общие объекты типа closure, например, PrivilegedAction в форму Callable, чтобы их можно было отправить.
- Типы параметров:
T- тип результата задачи- Параметры:
-
task- отправляемая задача - Возвращает:
- Future, представляющее ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
submit
<T> Future<T> submit(Runnable task, T result)
get вернёт указанный результат при успешном завершении.- Типы параметров:
T- тип результата- Параметры:
-
task- отправляемая задача -
result- возвращаемый результат - Возвращает:
- Future, представляющее ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
submit
Future<?> submit(Runnable task)
get вернёт null при успешном завершении.- Параметры:
-
task- отправляемая задача - Возвращает:
- Future, представляющее ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
Future.isDone() равно true для каждого элемента возвращаемого списка. Обратите внимание, что завершённая задача может завершиться либо нормально, либо сбросив исключение. Результаты этого метода не определены, если заданный набор модифицируется во время выполнения этой операции.- Типы параметров:
T- тип значений, возвращаемых задачами- Параметры:
-
tasks- коллекция задач - Возвращает:
- список Futures, представляющих задачи в том же порядке, что и итератор для заданного списка задач, каждая из которых завершена
- Исключения:
-
InterruptedException- если поток прерван во время ожидания, в этом случае незавершенные задачи отменяются -
NullPointerException- если задачи или любой из её элементов равныnull -
RejectedExecutionException- если любая задача не может быть запланирована для выполнения
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
Future.isDone() равно true для каждого элемента возвращаемого списка. По возвращении задачи, которые не завершены, отменяются. Обратите внимание, что завершённая задача может завершиться либо нормально, либо сбросив исключение. Результаты этого метода не определены, если заданный набор модифицируется во время выполнения этой операции.- Типы параметров:
T- тип значений, возвращаемых задачами- Параметры:
-
tasks- коллекция задач -
timeout- максимальное время ожидания -
unit- единица измерения времени аргумента времени ожидания - Возвращает:
- список Futures, представляющих задачи в том же порядке, что и итератор для заданного списка задач. Если операция не закончилась с истечением времени ожидания, каждая задача будет завершена. Если же время ожидания истекло, некоторые из задач не будут завершены.
- Исключения:
-
InterruptedException- если поток прерван во время ожидания, в этом случае незавершенные задачи отменяются -
NullPointerException- если задачи, любой из её элементов или единица измерения времени равныnull -
RejectedExecutionException- если любая задача не может быть запланирована для выполнения
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
- Типы параметров:
T- тип значений, возвращаемых задачами- Параметры:
-
tasks- коллекция задач - Возвращает:
- результат, возвращённый одной из задач
- Исключения:
-
InterruptedException- если поток прерван во время ожидания -
NullPointerException- если задачи или любая из задач, подлежащих выполнению, равныnull -
IllegalArgumentException- если задачи пуста -
ExecutionException- если ни одна задача не завершилась успешно -
RejectedExecutionException- если задачи не могут быть запланированы для выполнения
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
- Type Parameters:
T- тип значений, возвращаемых задачами- Parameters:
-
tasks- коллекция задач -
timeout- максимальное время ожидания -
unit- единица измерения времени таймаута - Returns:
- результат, возвращённый одной из задач
- Throws:
-
InterruptedException- если произошёл сбой во время ожидания -
NullPointerException- если задачи, или единица, или любая задача, подлежащая выполнению,null -
TimeoutException- если заданный таймаут истекает, прежде чем какая-либо задача успешно завершится -
ExecutionException- если ни одна задача не завершилась успешно -
RejectedExecutionException- если задачи не могут быть запланированы для выполнения
close
default void close()
Если во время ожидания произошёл сбой, этот метод останавливает все выполняющиеся задачи так, как если бы был вызван shutdownNow(). Затем он продолжает ожидать, пока все активно выполняющиеся задачи не завершатся. Задачи, которые ожидали выполнения, не выполняются. Статус прерывания будет повторно установлен перед возвратом из этого метода.
Если блок уже завершён, вызов этого метода не оказывает никакого эффекта.
- Specified by:
-
closeв интерфейсеAutoCloseable - Implementation Requirements:
- Реализация по умолчанию вызывает
shutdown()и ожидает завершения задач с помощьюawaitTermination. - Since:
- 19
© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/ExecutorService.html