Интерфейс 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 |
Выполняет заданные задачи, возвращая список Futures, содержащих их статус и результаты, когда все завершатся. |
<T> List |
invokeAll |
Выполняет заданные задачи, возвращая список Futures, содержащих их статус и результаты, когда все завершатся или истечет таймаут, что произойдет первым. |
<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 для этого.
- Throws:
-
SecurityException- если существует менеджер безопасности и остановка этого ExecutorService может манипулировать потоками, которые вызывающему элементу не разрешено изменять, потому что он не владеетRuntimePermission("modifyThread"), или метод менеджера безопасностиcheckAccessотказывает в доступе.
shutdownNow
List<Runnable> shutdownNow()
Этот метод не ожидает завершения активно выполняющихся задач. Используйте awaitTermination для этого.
Гарантий, кроме попыток остановить обработку активно выполняющихся задач, нет. Например, типичные реализации отменят с помощью Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
- Returns:
- список задач, которые никогда не начинали выполнение
- Throws:
-
SecurityException- если существует менеджер безопасности и остановка этого ExecutorService может манипулировать потоками, которые вызывающему элементу не разрешено изменять, потому что он не владеетRuntimePermission("modifyThread"), или метод менеджера безопасностиcheckAccessотказывает в доступе.
isShutdown
boolean isShutdown()
true если этот Executor был остановлен.- Returns:
-
trueесли этот Executor был остановлен
isTerminated
boolean isTerminated()
true если все задачи завершены после остановки. Обратите внимание, что isTerminated никогда не true , если не был вызван ни shutdown, ни shutdownNow. - Returns:
-
trueесли все задачи завершены после остановки
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
- Parameters:
-
timeout- максимальное время ожидания -
unit- единица измерения времени аргумента таймаута - Returns:
-
trueесли этот Executor завершился иfalseесли истекло время ожидания до завершения - Throws:
-
InterruptedException- если прерван при ожидании
submit
<T> Future<T> submit(Callable<T> task)
get Future вернёт результат задачи при успешном выполнении. Если вы хотите немедленно заблокировать ожидание задачи, вы можете использовать конструкции вида result = exec.submit(aCallable).get();
Примечание: Класс Executors включает набор методов, которые могут преобразовывать некоторые другие распространённые объекты типа замыкания, например, PrivilegedAction в форму Callable для их отправки.
- Type Parameters:
-
T- тип результата задачи - Parameters:
-
task- задача для отправки - Returns:
- Future, представляющий ожидающее завершение задачи
- Throws:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
submit
<T> Future<T> submit(Runnable task, T result)
get Future вернёт заданный результат при успешном выполнении.- Type Parameters:
-
T- тип результата - Parameters:
-
task- задача для отправки -
result- возвращаемый результат - Returns:
- Future, представляющий ожидающее завершение задачи
- Throws:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
submit
Future<?> submit(Runnable task)
get Future вернёт null при успешном завершении.- Parameters:
-
task- задача для отправки - Returns:
- Future, представляющий ожидающее завершение задачи
- Throws:
-
RejectedExecutionException- если задача не может быть запланирована для выполнения -
NullPointerException- если задача равна null
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
Future.isDone() равно true для каждого элемента возвращаемого списка. Обратите внимание, что завершённая задача могла завершиться либо нормально, либо сбросив исключение. Результаты этого метода не определены, если заданный коллектив изменён во время выполнения этой операции.- Type Parameters:
-
T- тип значений, возвращаемых задачами - Parameters:
-
tasks- коллекция задач - Returns:
- список Futures, представляющих задачи в том же последовательном порядке, что и итератор для заданного списка задач, каждая из которых завершена
- Throws:
-
InterruptedException- если прервано во время ожидания, в этом случае незавершенные задачи отменяются -
NullPointerException- если задачи или любой из её элементов являютсяnull, -
RejectedExecutionException- если какая-либо задача не может быть запланирована для выполнения
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
Future.isDone() равно true для каждого элемента возвращаемого списка. При возврате задачи, которые не были завершены, отменяются. Обратите внимание, что завершённая задача могла завершиться либо нормально, либо сбросив исключение. Результаты этого метода не определены, если заданный коллектив изменён во время выполнения этой операции.- Type Parameters:
-
T- тип значений, возвращаемых задачами - Parameters:
-
tasks- коллекция задач -
timeout- максимальное время ожидания -
unit- единица измерения времени аргумента таймаута - Returns:
- список Futures, представляющих задачи в том же последовательном порядке, что и итератор для заданного списка задач. Если операция не завершилась по таймауту, каждая задача будет завершена. Если же истекло время ожидания, некоторые из этих задач не завершатся.
- Throws:
-
InterruptedException- если прервано во время ожидания, в этом случае незавершенные задачи отменяются -
NullPointerException- если задачи, любой из её элементов или единица являютсяnull -
RejectedExecutionException- если какая-либо задача не может быть запланирована для выполнения
invokeAny
<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
- Type Parameters:
-
T- тип значений, возвращаемых задачами - Parameters:
-
tasks- коллекция задач - Returns:
- результат, возвращаемый одной из задач
- Throws:
-
InterruptedException- если прервано во время ожидания -
NullPointerException- если задачи или любая из элементов, подлежащих выполнению, являютсяnull -
IllegalArgumentException- если tasks пусто -
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. - Throws:
-
SecurityException- если существует менеджер безопасности и закрытие этого ExecutorService может изменять потоки, которые вызывающий элемент не имеет права изменять, потому что не владеетRuntimePermission("modifyThread"), или метод менеджера безопасностиcheckAccessотказывает в доступе. - Since:
- 19
© 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/ExecutorService.html