Интерфейс ExecutorService
- Все суперинтерфейсы:
Executor
- Все известные подинтерфейсы:
ScheduledExecutorService
- Все известные реализующие классы:
-
AbstractExecutorService,ForkJoinPool,ScheduledThreadPoolExecutor,ThreadPoolExecutor
public interface ExecutorService extends Executor
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 в две фазы, сначала вызывая 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 |
Ожидает завершения всех задач после запроса на остановку, либо истечения таймаута, либо прерывания текущего потока, в зависимости от того, что произойдет раньше. |
<T> List<Future<T>> |
invokeAll |
Выполняет заданные задачи, возвращая список Futures, содержащий их статус и результаты, когда все они завершены. |
<T> List<Future<T>> |
invokeAll |
Выполняет заданные задачи, возвращая список Futures, содержащий их статус и результаты, когда все они завершены или истекает таймаут, в зависимости от того, что произойдет раньше. |
<T> T |
invokeAny |
Выполняет заданные задачи, возвращая результат одной успешно завершенной задачи (т.е. без исключений), если таковая есть. |
<T> T |
invokeAny |
Выполняет заданные задачи, возвращая результат одной успешно завершенной задачи (т.е. без исключений), если таковая есть, до истечения заданного таймаута. |
boolean |
isShutdown() |
Возвращает true , если этот ExecutorService был остановлен. |
boolean |
isTerminated() |
Возвращает true , если все задачи завершены после остановки. |
void |
shutdown() |
Инициализирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются. |
List<Runnable> |
shutdownNow() |
Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, которые ожидали выполнения. |
Future<?> |
submit |
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future<T> |
submit |
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future<T> |
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 если этот исполняемый модуль был остановлен.- Returns:
-
trueесли этот исполняемый модуль был остановлен
isTerminated
boolean isTerminated()
true если все задачи завершены после остановки. Обратите внимание, что isTerminated никогда не true, если сначала не был вызван либо shutdown либо shutdownNow. - Returns:
-
trueесли все задачи завершены после остановки
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
- Parameters:
-
timeout- максимальное время ожидания -
unit- единица измерения времени аргумента таймаута - Returns:
-
trueесли этот исполняемый модуль завершен и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- если задачи пустые -
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- если задачи не могут быть запланированы для выполнения
© 1993, 2021, 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/17/docs/api/java.base/java/util/concurrent/ExecutorService.html