Spec-Zone.ru › OpenJDK 21

Интерфейс 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(long timeout, TimeUnit unit)
Блокирует, пока все задачи не будут завершены после запроса на остановку, или истечет таймаут, или текущий поток будет прерван, что произойдет первым.
default void close()
Инициализирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются.
<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()
Возвращает true, если этот исполнитель был остановлен.
boolean isTerminated()
Возвращает true, если все задачи завершены после остановки.
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 для этого.

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)
Отправляет возвращающую значение задачу для выполнения и возвращает Future, представляющую ожидаемые результаты задачи. Метод 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)
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. Метод get Future вернёт заданный результат при успешном выполнении.
Type Parameters:
T - тип результата
Parameters:
task - задача для отправки
result - возвращаемый результат
Returns:
Future, представляющий ожидающее завершение задачи
Throws:
RejectedExecutionException - если задача не может быть запланирована для выполнения
NullPointerException - если задача равна null

submit

Future<?> submit(Runnable task)
Отправляет задачу Runnable для выполнения и возвращает Future, представляющую эту задачу. Метод get Future вернёт null при успешном завершении.
Parameters:
task - задача для отправки
Returns:
Future, представляющий ожидающее завершение задачи
Throws:
RejectedExecutionException - если задача не может быть запланирована для выполнения
NullPointerException - если задача равна null

invokeAll

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
Выполняет заданные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершатся. 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
Выполняет заданные задачи, возвращая список Futures, содержащих их состояние и результаты, когда все завершатся или истечёт время ожидания, что произойдёт раньше. 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API