Spec-Zone.ru › OpenJDK 25

Интерфейс 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)
Выполняет заданные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач.
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
Выполняет заданные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач или истечения времени ожидания — в зависимости от того, что произойдёт раньше.
<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, представляющий ожидаемый результат задачи.

Методы, объявленные в интерфейсе Executor

execute

Подробное описание методов

shutdown

void shutdown()
Инициирует упорядоченное выключение, при котором ранее отправленные задачи выполняются, но новые задачи не принимаются. Если исполнитель уже выключен, вызов не оказывает дополнительного эффекта.

Этот метод не ожидает завершения выполнения ранее отправленных задач. Для этого используйте awaitTermination.

shutdownNow

List<Runnable> shutdownNow()
Пытается остановить все активно выполняющиеся задачи, прекращает обработку ожидающих задач и возвращает список задач, ожидавших выполнения.

Этот метод не ожидает завершения активно выполняющихся задач. Для этого используйте awaitTermination.

Метод лишь прилагает все возможные усилия для остановки обработки активно выполняющихся задач и не даёт никаких гарантий. Например, типичные реализации отменяют задачи с помощью Thread.interrupt(), поэтому задача, не реагирующая на прерывания, может никогда не завершиться.

Возвращает:
список задач, выполнение которых так и не началось

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
Выполняет заданные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач. Для каждого элемента возвращённого списка Future.isDone() имеет значение true. Обратите внимание, что завершённая задача могла завершиться как обычным образом, так и с выбросом исключения. Результаты этого метода не определены, если заданная коллекция изменяется во время выполнения этой операции.
Параметры типа:
T — тип значений, возвращаемых задачами
Параметры:
tasks — коллекция задач
Возвращает:
список объектов Future, представляющих задачи в том же порядке, в котором их возвращает итератор для заданного списка задач; все задачи в списке завершены
Выбрасывает:
InterruptedException — если ожидание было прервано; в этом случае незавершённые задачи отменяются
NullPointerException — если коллекция tasks или любой её элемент равны null
RejectedExecutionException — если невозможно запланировать выполнение какой-либо задачи

invokeAll

<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
Выполняет заданные задачи и возвращает список объектов Future с их состояниями и результатами после завершения всех задач или истечения времени ожидания — в зависимости от того, что произойдёт раньше. Для каждого элемента возвращённого списка Future.isDone() имеет значение true. При возврате метода незавершённые задачи отменяются. Обратите внимание, что завершённая задача могла завершиться как обычным образом, так и с выбросом исключения. Результаты этого метода не определены, если заданная коллекция изменяется во время выполнения этой операции.
Параметры типа:
T — тип значений, возвращаемых задачами
Параметры:
tasks — коллекция задач
timeout — максимальное время ожидания
unit — единица измерения аргумента времени ожидания
Возвращает:
список объектов Future, представляющих задачи в том же порядке, в котором их возвращает итератор для заданного списка задач. Если время ожидания не истекло, все задачи будут завершены. Если время ожидания истекло, некоторые задачи могут остаться незавершёнными.
Выбрасывает:
InterruptedException — если ожидание было прервано; в этом случае незавершённые задачи отменяются
NullPointerException — если tasks, любой его элемент или unit равны null
RejectedExecutionException — если невозможно запланировать выполнение какой-либо задачи

invokeAny

<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
Выполняет заданные задачи и возвращает результат одной из них, если она завершилась успешно (то есть не выбросила исключение). При обычном или исключительном завершении метода незавершённые задачи отменяются. Результаты этого метода не определены, если заданная коллекция изменяется во время выполнения этой операции.
Параметры типа:
T — тип значений, возвращаемых задачами
Параметры:
tasks — коллекция задач
Возвращает:
результат, возвращённый одной из задач
Выбрасывает:
InterruptedException — если ожидание было прервано
NullPointerException — если tasks или любой элемент задачи, подлежащей выполнению, равны null
IllegalArgumentException — если tasks пуст
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 — если tasks, unit или любой элемент задачи, подлежащей выполнению, равны null
TimeoutException — если заданное время ожидания истекло до успешного завершения какой-либо задачи
ExecutionException — если ни одна задача не завершилась успешно
RejectedExecutionException — если невозможно запланировать выполнение задач

close

default void close()
Инициирует упорядоченное выключение, при котором ранее отправленные задачи выполняются, но новые задачи не принимаются. Этот метод ожидает завершения выполнения всех задач и завершения работы исполнителя.

Если ожидание прервано, этот метод останавливает все выполняющиеся задачи, как если бы был вызван shutdownNow(). Затем он продолжает ожидание до завершения всех активно выполняющихся задач. Задачи, ожидавшие выполнения, не выполняются. Перед возвратом из метода статус прерывания будет восстановлен.

Если работа исполнителя уже завершена, вызов этого метода не оказывает эффекта.

Определён в:
close в интерфейсе AutoCloseable
Требования к реализации:
Реализация по умолчанию вызывает shutdown() и ожидает завершения выполнения задач с помощью awaitTermination.
С момента версии:
19

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе документации Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/util/concurrent/ExecutorService.html

Spec-Zone.ru

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