Интерфейс 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, если работа этого исполнителя завершена, иfalse, если время ожидания истекло до завершения - Выбрасывает:
-
InterruptedException— если ожидание было прервано
submit
<T> Future<T> submit(Callable<T> task)
get объекта Future вернёт результат задачи после её успешного завершения. Если вы хотите сразу же заблокировать выполнение в ожидании задачи, можно использовать конструкции вида result = exec.submit(aCallable).get();
Примечание. Класс Executors включает набор методов для преобразования некоторых других распространённых объектов, подобных замыканиям, например PrivilegedAction, в форму Callable, чтобы их можно было отправлять на выполнение.
- Параметры типа:
T— тип результата задачи- Параметры:
-
task— задача для отправки - Возвращает:
- объект Future, представляющий ожидающее завершения задачи
- Выбрасывает:
-
RejectedExecutionException— если невозможно запланировать выполнение задачи -
NullPointerException— если задача равна null
submit
<T> Future<T> submit(Runnable task, T result)
get объекта Future вернёт заданный результат после успешного завершения.- Параметры типа:
T— тип результата- Параметры:
-
task— задача для отправки -
result— возвращаемый результат - Возвращает:
- объект Future, представляющий ожидающее завершения задачи
- Выбрасывает:
-
RejectedExecutionException— если невозможно запланировать выполнение задачи -
NullPointerException— если задача равна null
submit
Future<?> submit(Runnable task)
get объекта Future вернёт null после успешного завершения.- Параметры:
-
task— задача для отправки - Возвращает:
- объект Future, представляющий ожидающее завершения задачи
- Выбрасывает:
-
RejectedExecutionException— если невозможно запланировать выполнение задачи -
NullPointerException— если задача равна null
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
Future.isDone() имеет значение true. Обратите внимание, что завершённая задача могла завершиться как обычным образом, так и с выбросом исключения. Результаты этого метода не определены, если заданная коллекция изменяется во время выполнения этой операции.- Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач - Возвращает:
- список объектов Future, представляющих задачи в том же порядке, в котором их возвращает итератор для заданного списка задач; все задачи в списке завершены
- Выбрасывает:
-
InterruptedException— если ожидание было прервано; в этом случае незавершённые задачи отменяются -
NullPointerException— если коллекция tasks или любой её элемент равны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— единица измерения аргумента времени ожидания - Возвращает:
- список объектов Future, представляющих задачи в том же порядке, в котором их возвращает итератор для заданного списка задач. Если время ожидания не истекло, все задачи будут завершены. Если время ожидания истекло, некоторые задачи могут остаться незавершёнными.
- Выбрасывает:
-
InterruptedException— если ожидание было прервано; в этом случае незавершённые задачи отменяются -
NullPointerException— если tasks, любой его элемент или unit равныnull -
RejectedExecutionException— если невозможно запланировать выполнение какой-либо задачи
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
- Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач - Возвращает:
- результат, возвращённый одной из задач
- Выбрасывает:
-
InterruptedException— если ожидание было прервано -
NullPointerException— если tasks или любой элемент задачи, подлежащей выполнению, равныnull -
IllegalArgumentException— если tasks пуст -
ExecutionException— если ни одна задача не завершилась успешно -
RejectedExecutionException— если невозможно запланировать выполнение задач
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
- Параметры типа:
T— тип значений, возвращаемых задачами- Параметры:
-
tasks— коллекция задач -
timeout— максимальное время ожидания -
unit— единица измерения аргумента времени ожидания - Возвращает:
- результат, возвращённый одной из задач
- Выбрасывает:
-
InterruptedException— если ожидание было прервано -
NullPointerException— если tasks, unit или любой элемент задачи, подлежащей выполнению, равныnull -
TimeoutException— если заданное время ожидания истекло до успешного завершения какой-либо задачи -
ExecutionException— если ни одна задача не завершилась успешно -
RejectedExecutionException— если невозможно запланировать выполнение задач
close
default void close()
Если ожидание прервано, этот метод останавливает все выполняющиеся задачи, как если бы был вызван shutdownNow(). Затем он продолжает ожидание до завершения всех активно выполняющихся задач. Задачи, ожидавшие выполнения, не выполняются. Перед возвратом из метода статус прерывания будет восстановлен.
Если работа исполнителя уже завершена, вызов этого метода не оказывает эффекта.
- Определён в:
-
closeв интерфейсеAutoCloseable - Требования к реализации:
- Реализация по умолчанию вызывает
shutdown()и ожидает завершения выполнения задач с помощьюawaitTermination. - С момента версии:
- 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ExecutorService.html