Spec-Zone.ru › OpenJDK 17

Интерфейс 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(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()
Возвращает true , если этот ExecutorService был остановлен.
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 если этот исполняемый модуль был остановлен.
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)
Отправляет задачу, возвращающую значение, для выполнения и возвращает 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 - если задачи пустые
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

Spec-Zone.ru

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