Интерфейс ExecutorService
- Все суперинтерфейсы:
Executor
- Все известные подинтерфейсы:
ScheduledExecutorService
- Все известные реализующие классы:
-
AbstractExecutorService,ForkJoinPool,ScheduledThreadPoolExecutor,ThreadPoolExecutor
public interface ExecutorService extends Executor
A 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 ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
} Эффекты согласованности памяти: Действия в потоке до отправки задачи Runnable или Callable исполнителю ExecutorService предшествуют любым действиям, выполняемым этой задачей, которые, в свою очередь, предшествуют получению результата через Future.get().
- C:
- 1.5
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean | awaitTermination(long timeout,
TimeUnit unit) | Ожидает, пока все задачи не завершат выполнение после запроса на остановку, или истечет заданный таймаут, или текущий поток будет прерван, что произойдет первым. |
<T> List<Future<T>> | invokeAll(Collection<? extends Callable<T>> tasks) | Выполняет заданные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершатся. |
<T> List<Future<T>> | invokeAll(Collection<? extends Callable<T>> tasks,
long timeout,
TimeUnit unit) | Выполняет заданные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершатся или истечет таймаут, что произойдет первым. |
<T> T | invokeAny(Collection<? extends Callable<T>> tasks) | Выполняет заданные задачи, возвращая результат одной, которая завершилась успешно (т. е. без выброса исключения), если таковые имеются. |
<T> T | invokeAny(Collection<? extends Callable<T>> tasks,
long timeout,
TimeUnit unit) | Выполняет заданные задачи, возвращая результат одной, которая завершилась успешно (т. е. без выброса исключения), если таковые имеются, до истечения заданного таймаута. |
boolean | isShutdown() | Возвращает |
boolean | isTerminated() | Возвращает |
void | shutdown() | Инициирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются. |
List<Runnable> | shutdownNow() | Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, которые ожидали выполнения. |
Future<?> | submit(Runnable task) | Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future<T> | submit(Runnable task,
T result) | Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. |
<T> Future<T> | submit(Callable<T> task) | Отправляет возвращающую значение задачу для выполнения и возвращает Future, представляющую ожидаемые результаты задачи. |
Методы, объявленные в интерфейсе java.util.concurrent.Executor
execute Методы
shutdown
void shutdown()
Инициирует упорядоченное завершение работы, при котором ранее отправленные задачи выполняются, но новые задачи приниматься не будут. Вызов не оказывает дополнительного эффекта, если уже завершен.
Этот метод не ожидает завершения выполнения ранее отправленных задач. Используйте awaitTermination для этого.
- Исключения:
-
SecurityException- если существует менеджер безопасности и завершение работы этого ExecutorService может изменять потоки, которые вызывающий абонент не имеет права изменять, поскольку он не обладаетRuntimePermission("modifyThread"), или методcheckAccessменеджера безопасности запрещает доступ.
shutdownNow
List<Runnable> shutdownNow()
Пытается остановить все активно выполняющиеся задачи, прекращает обработку ожидающих задач и возвращает список задач, которые ожидали выполнения.
Этот метод не ожидает завершения активно выполняющихся задач. Используйте awaitTermination для этого.
Гарантий, помимо попыток остановить обработку активно выполняющихся задач, нет. Например, типичные реализации будут отменять через Thread.interrupt(), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
- Возвращает:
- список задач, которые никогда не начали выполнение
- Исключения:
-
SecurityException- если существует менеджер безопасности и завершение работы этого ExecutorService может изменять потоки, которые вызывающий абонент не имеет права изменять, поскольку он не обладаетRuntimePermission("modifyThread"), или методcheckAccessменеджера безопасности запрещает доступ.
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)
Отправляет задачу с возвратом значения на выполнение и возвращает Future, представляющий ожидаемые результаты задачи. Метод 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) Отправляет задачу Runnable на выполнение и возвращает Future, представляющий эту задачу. Метод get Future вернет указанный результат после успешного завершения.
- Параметры типа:
-
T- тип результата - Параметры:
-
task- задача для отправки -
result- результат для возврата - Возвращает:
- Future, представляющий ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задачу нельзя запланировать на выполнение -
NullPointerException- если задача равна null
submit
Future<?> submit(Runnable task)
Отправляет задачу Runnable на выполнение и возвращает Future, представляющий эту задачу. Метод get Future вернет null после успешного завершения.
- Параметры:
-
task- задача для отправки - Возвращает:
- Future, представляющий ожидаемое завершение задачи
- Исключения:
-
RejectedExecutionException- если задачу нельзя запланировать на выполнение -
NullPointerException- если задача равна null
invokeAll
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException Выполняет указанные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершены. 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 Выполняет указанные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершены или истекает время ожидания, в зависимости от того, что произойдет раньше. 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 Выполняет указанные задачи, возвращая результат одной из успешно завершенных (т. е. без выброса исключения), если таковые имеются до истечения заданного времени ожидания. При нормальном или исключительном возврате задачи, которые не были завершены, отменяются. Результаты этого метода не определены, если заданная коллекция изменяется во время выполнения этой операции.
- Параметры типа:
-
T- тип значений, возвращаемых из задач - Параметры:
-
tasks- коллекция задач -
timeout- максимальное время ожидания -
unit- временная единица аргумента времени ожидания - Возвращает:
- результат, возвращенный одной из задач
- Исключения:
-
InterruptedException- если прервано во время ожидания -
NullPointerException- если задачи или единица или любая задача элемента, подлежащая выполнению, являетсяnull -
TimeoutException- если заданное время ожидания истекает до успешного завершения любой задачи -
ExecutionException- если ни одна задача не завершается успешно -
RejectedExecutionException- если задачи не могут быть запланированы на выполнение
© 1993, 2020, 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/11/docs/api/java.base/java/util/concurrent/ExecutorService.html