Spec-Zone.ru › OpenJDK 21

Класс ThreadPoolExecutor

java.lang.Object
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ThreadPoolExecutor
Все реализуемые интерфейсы:
AutoCloseable, Executor, ExecutorService
Непосредственные известные подклассы:
ScheduledThreadPoolExecutor
public class ThreadPoolExecutor extends AbstractExecutorService
Класс ExecutorService, который выполняет каждую переданную задачу с использованием одного из, возможно, нескольких пулов потоков, обычно настраиваемых с помощью фабричных методов класса Executors.

Пулы потоков решают две разные проблемы: они обычно обеспечивают улучшенную производительность при выполнении большого числа асинхронных задач за счет уменьшения накладных расходов на вызов каждой задачи, и они обеспечивают возможность ограничения и управления ресурсами, включая потоки, используемые при выполнении набора задач. Каждый ThreadPoolExecutor также сохраняет некоторую базовые статистические данные, такие как количество завершенных задач.

Для полезного использования в широком диапазоне контекстов этот класс предоставляет множество настраиваемых параметров и расширяемых точек. Однако программистам настоятельно рекомендуется использовать более удобные фабричные методы класса Executors - Executors.newCachedThreadPool() (неограниченный пул потоков с автоматическим освобождением потоков), Executors.newFixedThreadPool(int) (пул потоков фиксированного размера) и Executors.newSingleThreadExecutor() (одиночный фоновый поток), которые предварительно настраивают параметры для наиболее распространенных сценариев использования. В противном случае следуйте руководству при настройке и настройке этого класса:

Основные и максимальные размеры пула
A ThreadPoolExecutor будет автоматически настраивать размер пула (см. getPoolSize()) в соответствии с границами, заданными corePoolSize (см. getCorePoolSize()) и maximumPoolSize (см. getMaximumPoolSize()). При отправке новой задачи в методе execute(Runnable), если запущено меньше corePoolSize потоков, создается новый поток для обработки запроса, даже если другие рабочие потоки простаивают. В противном случае, если запущено меньше maximumPoolSize потоков, новый поток будет создан для обработки запроса только в случае, если очередь заполнена. Установив corePoolSize и maximumPoolSize одинаковыми, вы создадите пул потоков фиксированного размера. Установив maximumPoolSize на существенно неограниченное значение, например, Integer.MAX_VALUE, вы разрешите пулу вместить произвольное количество одновременных задач. Чаще всего, основные и максимальные размеры пула устанавливаются только при создании, но их также можно изменить динамически с помощью setCorePoolSize(int) и setMaximumPoolSize(int).
Создание по требованию
По умолчанию, даже основные потоки изначально создаются и запускаются только при поступлении новых задач, но это можно динамически изменить, используя метод prestartCoreThread() или prestartAllCoreThreads(). Вероятно, вам захочется запустить потоки, если вы создаете пул с непустой очередью.
Создание новых потоков
Новые потоки создаются с использованием ThreadFactory. Если не указано иное, используется Executors.defaultThreadFactory(), который создает потоки, которые все находятся в одной ThreadGroup и имеют одинаковый NORM_PRIORITY приоритет и не являются демонами. Предоставив другой ThreadFactory, вы можете изменить имя потока, группу потоков, приоритет, статус демона и т. д. Если ThreadFactory не удается создать поток, вернув null из newThread, исполняемый модуль продолжит работу, но может не выполнить какие-либо задачи. Потоки должны обладать правом "modifyThread" RuntimePermission. Если рабочие потоки или другие потоки, использующие пул, не обладают этим правом, производительность может быть снижена: изменения конфигурации могут не вступить в силу своевременно, и пул завершения может оставаться в состоянии, в котором завершение возможно, но не выполнено.
Время ожидания
Если в пуле в данный момент больше, чем corePoolSize потоков, избыточные потоки будут завершены, если они простаивали более keepAliveTime (см. getKeepAliveTime(TimeUnit)). Это позволяет уменьшить потребление ресурсов, когда пул не используется активно. Если позже пул станет более активным, будут созданы новые потоки. Этот параметр также можно изменить динамически, используя метод setKeepAliveTime(long, TimeUnit). Использование значения Long.MAX_VALUE TimeUnit.NANOSECONDS фактически отключает возможность завершения простаивающих потоков до завершения работы. По умолчанию политика ожидания применяется только тогда, когда потоков больше, чем corePoolSize, но метод allowCoreThreadTimeOut(boolean) может быть использован для применения этой политики тайм-аута к основным потокам также, при условии, что значение keepAliveTime не равно нулю.
Очередь
Любая BlockingQueue может использоваться для передачи и хранения отправленных задач. Использование этой очереди взаимодействует с размером пула:
  • Если запущено меньше corePoolSize потоков, Executor всегда предпочитает добавление нового потока, а не помещение в очередь.
  • Если запущено corePoolSize или более потоков, Executor всегда предпочитает помещение запроса в очередь, а не добавление нового потока.
  • Если запрос не может быть помещен в очередь, создается новый поток, если это не превысит maximumPoolSize, в противном случае задача будет отклонена.
Существует три общие стратегии для очереди:
  1. Прямые переходы. Хорошим выбором для очереди задач является SynchronousQueue, который передает задачи потокам без удержания их в противном случае. Здесь попытка поместить задачу в очередь завершится неудачей, если нет потоков, готовых ее выполнить, поэтому будет создан новый поток. Эта политика позволяет избежать блокировок при обработке наборов запросов, которые могут иметь внутренние зависимости. Прямые переходы обычно требуют неограниченных maximumPoolSizes, чтобы избежать отклонения новых отправленных задач. Это, в свою очередь, допускает возможность неограниченного роста потоков, когда команды в среднем поступают быстрее, чем могут быть обработаны.
  2. Неограниченные очереди. Использование неограниченной очереди (например, LinkedBlockingQueue без предварительно определенной емкости) приведет к ожиданию новых задач в очереди, когда все потоки corePoolSize заняты. Таким образом, никогда не будет создано более corePoolSize потоков. (А значение maximumPoolSize, следовательно, не имеет никакого эффекта.) Это может быть уместно, когда каждая задача полностью независима от других, поэтому задачи не могут влиять на выполнение друг друга; например, в веб-сервере. Хотя этот стиль очереди может быть полезен для сглаживания кратковременных всплесков запросов, он допускает возможность неограниченного роста очереди задач, когда команды в среднем поступают быстрее, чем могут быть обработаны.
  3. Ограниченные очереди. Ограниченная очередь (например, ArrayBlockingQueue) помогает предотвратить истощение ресурсов при использовании конечных maximumPoolSizes, но может быть сложнее настроить и контролировать. Размеры очереди и максимальные размеры пула могут быть взаимно компенсированы друг другом: использование больших очередей и малых пулов минимизирует использование процессора, ресурсы ОС и накладные расходы переключения контекста, но может привести к искусственно низкой производительности. Если задачи часто блокируются (например, если они связаны с вводом-выводом), система может запланировать время для большего количества потоков, чем вы иначе разрешаете. Использование небольших очередей обычно требует больших размеров пула, что удерживает процессоры более загруженными, но может столкнуться с неприемлемыми накладными расходами планирования, что также снижает пропускную способность.
Отклоненные задачи
Новые задачи, отправленные в методе execute(Runnable), будут отклонены, когда Executor был остановлен, а также когда Executor использует конечные границы как для максимального числа потоков, так и для емкости очереди задач, и насыщен. В любом случае, метод execute вызывает метод RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor) своего RejectedExecutionHandler. Предоставляются четыре предопределенные политики обработчика:
  1. В стандартной ThreadPoolExecutor.AbortPolicy, обработчик выбрасывает исключение runtime RejectedExecutionException при отклонении.
  2. В ThreadPoolExecutor.CallerRunsPolicy, поток, вызывающий execute сам выполняет задачу. Это обеспечивает простую механику обратной связи, которая замедлит темп отправки новых задач.
  3. В ThreadPoolExecutor.DiscardPolicy, задача, которую нельзя выполнить, просто отбрасывается. Эта политика предназначена только для тех редких случаев, когда завершение задачи никогда не используется.
  4. В ThreadPoolExecutor.DiscardOldestPolicy, если Executor не остановлен, задача в начале очереди задач отбрасывается, а затем выполняется попытка выполнения (которая может снова завершиться неудачей, вызывая повторение этого процесса). Эта политика редко приемлема. Почти во всех случаях вы также должны отменить задачу, чтобы вызвать исключение в любом компоненте, ожидающем ее завершения, и/или записать ошибку, как показано в документации ThreadPoolExecutor.DiscardOldestPolicy.
Возможно определить и использовать другие типы RejectedExecutionHandler классов. Для этого требуется осторожность, особенно когда политики предназначены для работы только в определенных условиях емкости или политики очереди.
Методы обратного вызова
Этот класс предоставляет protected переопределяемые beforeExecute(Thread, Runnable) и afterExecute(Runnable, Throwable) методы, которые вызываются до и после выполнения каждой задачи. Они могут использоваться для управления средой выполнения; например, для повторной инициализации ThreadLocals, сбора статистики или добавления записей журнала. Кроме того, метод terminated() может быть переопределен для выполнения любой специальной обработки, которая должна быть выполнена после полного завершения Executor.

Если методы обратного вызова или BlockingQueue генерируют исключения, внутренние рабочие потоки могут, в свою очередь, выйти из строя, прерваться и, возможно, быть заменены.

Управление очередью
Метод getQueue() позволяет получить доступ к очереди задач для целей мониторинга и отладки. Использование этого метода для других целей настоятельно не рекомендуется. Два предоставляемых метода, remove(Runnable) и purge(), доступны для помощи в освобождении памяти при отмене большого количества задач в очереди.
Освобождение ресурсов
Пул, на который больше нет ссылок в программе И в котором нет оставшихся потоков, может быть освобожден (утилизирован сборщиком мусора), не закрываясь явно. Вы можете настроить пул, чтобы позволить всем неиспользуемым потокам в конечном итоге умереть, установив соответствующие значения времени ожидания, используя нижнюю границу нулевых основных потоков и/или установив allowCoreThreadTimeOut(boolean).

Пример расширения. Большинство расширений этого класса переопределяют один или несколько защищенных методов обратного вызова. Например, вот подкласс, который добавляет простую функцию паузы/возобновления:

 
 class PausableThreadPoolExecutor extends ThreadPoolExecutor {
   private boolean isPaused;
   private ReentrantLock pauseLock = new ReentrantLock();
   private Condition unpaused = pauseLock.newCondition();

   public PausableThreadPoolExecutor(...) { super(...); }

   protected void beforeExecute(Thread t, Runnable r) {
     super.beforeExecute(t, r);
     pauseLock.lock();
     try {
       while (isPaused) unpaused.await();
     } catch (InterruptedException ie) {
       t.interrupt();
     } finally {
       pauseLock.unlock();
     }
   }

   public void pause() {
     pauseLock.lock();
     try {
       isPaused = true;
     } finally {
       pauseLock.unlock();
     }
   }

   public void resume() {
     pauseLock.lock();
     try {
       isPaused = false;
       unpaused.signalAll();
     } finally {
       pauseLock.unlock();
     }
   }
 }
С:
1.5

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static class  ThreadPoolExecutor.AbortPolicy
Обработчик отклоненных задач, который выбрасывает исключение RejectedExecutionException.
static class  ThreadPoolExecutor.CallerRunsPolicy
Обработчик отклоненных задач, который выполняет отклоненную задачу непосредственно в потоке вызова метода execute, если исполняющий поток не был остановлен, в противном случае задача отбрасывается.
static class  ThreadPoolExecutor.DiscardOldestPolicy
Обработчик отклоненных задач, который отбрасывает самую старую необработанную заявку и затем повторно пытается выполнить execute, если исполняющий поток не был остановлен, в противном случае задача отбрасывается.
static class  ThreadPoolExecutor.DiscardPolicy
Обработчик отклоненных задач, который безмолвно отбрасывает отклоненную задачу.

Краткое описание конструкторов

Конструктор Описание
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами, фабрикой потоков по умолчанию и обработчиком отклоненных задач по умолчанию.
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и фабрикой потоков по умолчанию.
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и обработчиком отклоненных задач по умолчанию.
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами.

Краткое описание методов

Модификатор и тип Метод Описание
protected void afterExecute(Runnable r, Throwable t)
Метод, вызываемый по завершении выполнения заданного Runnable.
void allowCoreThreadTimeOut(boolean value)
Устанавливает политику управления временем ожидания ядра потоков и их завершения, если в течение времени ожидания не поступают задачи, при необходимости заменяя их при появлении новых задач.
boolean allowsCoreThreadTimeOut()
Возвращает true, если в этом пуле ядро потоков может завершиться при достижении времени ожидания, если в течение времени ожидания не поступают задачи, при необходимости заменяя их при появлении новых задач.
boolean awaitTermination(long timeout, TimeUnit unit)
Ожидает завершения всех задач после запроса остановки, или таймаута, или прерывания текущего потока — в зависимости от того, что произойдёт раньше.
protected void beforeExecute(Thread t, Runnable r)
Метод, вызываемый перед выполнением заданного Runnable в заданном потоке.
void execute(Runnable command)
Выполняет заданную задачу в будущем.
protected void finalize()
Устарело, для удаления: Этот элемент API может быть удалён в будущей версии.
Финализация устарела для удаления.
int getActiveCount()
Возвращает приблизительное количество потоков, активно выполняющих задачи.
long getCompletedTaskCount()
Возвращает приблизительное общее количество завершённых задач.
int getCorePoolSize()
Возвращает количество ядра потоков.
long getKeepAliveTime(TimeUnit unit)
Возвращает время ожидания потока, которое является временем, в течение которого потоки могут оставаться бездействующими перед завершением.
int getLargestPoolSize()
Возвращает наибольшее количество потоков, которые одновременно находились в пуле.
int getMaximumPoolSize()
Возвращает максимальное допустимое количество потоков.
int getPoolSize()
Возвращает текущее количество потоков в пуле.
BlockingQueue<Runnable> getQueue()
Возвращает очередь задач, используемая этим исполнителем.
RejectedExecutionHandler getRejectedExecutionHandler()
Возвращает текущий обработчик для невыполняемых задач.
long getTaskCount()
Возвращает приблизительное общее количество задач, которые когда-либо были запланированы для выполнения.
ThreadFactory getThreadFactory()
Возвращает фабрику потоков, используемую для создания новых потоков.
boolean isShutdown()
Возвращает true, если этот исполнитель был остановлен.
boolean isTerminated()
Возвращает true, если все задачи завершены после остановки.
boolean isTerminating()
Возвращает true, если этот исполнитель находится в процессе завершения после вызова shutdown() или shutdownNow(), но ещё не завершён полностью.
int prestartAllCoreThreads()
Запускает все ядро потоков, вызывая их ожидание работы.
boolean prestartCoreThread()
Запускает ядро потока, вызывая его ожидание работы.
void purge()
Пытается удалить из очереди задач все задачи Future, которые были отменены.
boolean remove(Runnable task)
Удаляет эту задачу из внутренней очереди исполнителя, если она там присутствует, тем самым предотвращая её выполнение, если она ещё не началась.
void setCorePoolSize(int corePoolSize)
Устанавливает количество ядра потоков.
void setKeepAliveTime(long time, TimeUnit unit)
Устанавливает время ожидания потока, которое является временем, в течение которого потоки могут оставаться бездействующими перед завершением.
void setMaximumPoolSize(int maximumPoolSize)
Устанавливает максимальное допустимое количество потоков.
void setRejectedExecutionHandler(RejectedExecutionHandler handler)
Устанавливает новый обработчик для невыполняемых задач.
void setThreadFactory(ThreadFactory threadFactory)
Устанавливает фабрику потоков, используемую для создания новых потоков.
void shutdown()
Инициирует упорядоченную остановку, в которой ранее отправленные задачи выполняются, но новые задачи не принимаются.
List<Runnable> shutdownNow()
Пытается остановить все активно выполняемые задачи, останавливает обработку ожидающих задач и возвращает список задач, которые ожидали выполнения.
protected void terminated()
Метод, вызываемый при завершении исполнителя.
String toString()
Возвращает строку, идентифицирующую этот пул, а также его состояние, включая указания на состояние выполнения и приблизительное количество рабочих потоков и задач.

Методы, унаследованные от класса java.util.concurrent.AbstractExecutorService

invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit

Методы, унаследованные от класса java.lang.Object

clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait

Методы, унаследованные от интерфейса java.util.concurrent.ExecutorService

close

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

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами, по умолчанию фабрикой потоков и обработчиком отклоненных задач по умолчанию.

Для удобства использования можно воспользоваться одним из Executors методов фабрики вместо этого конструктора общего назначения.

Параметры:
corePoolSize - число потоков, которое нужно поддерживать в пуле, даже если они бездействуют, если не установлено allowCoreThreadTimeOut
maximumPoolSize - максимальное число потоков, разрешённое в пуле
keepAliveTime - если число потоков больше базового, это максимальное время, которое избыточные бездействующие потоки будут ожидать новых задач перед завершением.
unit - единица измерения времени для аргумента keepAliveTime
workQueue - очередь для хранения задач перед их выполнением. Эта очередь будет содержать только Runnable задачи, отправленные методом execute.
Исключения:
IllegalArgumentException - если выполняется одно из следующих условий:
corePoolSize < 0
keepAliveTime < 0
maximumPoolSize <= 0
maximumPoolSize < corePoolSize
NullPointerException - если workQueue равно null

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и обработчиком отклоненных задач по умолчанию.
Параметры:
corePoolSize - число потоков, которое нужно поддерживать в пуле, даже если они бездействуют, если не установлено allowCoreThreadTimeOut
maximumPoolSize - максимальное число потоков, разрешённое в пуле
keepAliveTime - если число потоков больше базового, это максимальное время, которое избыточные бездействующие потоки будут ожидать новых задач перед завершением.
unit - единица измерения времени для аргумента keepAliveTime
workQueue - очередь для хранения задач перед их выполнением. Эта очередь будет содержать только Runnable задачи, отправленные методом execute.
threadFactory - фабрика, используемая при создании нового потока исполнителем
Исключения:
IllegalArgumentException - если выполняется одно из следующих условий:
corePoolSize < 0
keepAliveTime < 0
maximumPoolSize <= 0
maximumPoolSize < corePoolSize
NullPointerException - если workQueue или threadFactory равны null

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и по умолчанию фабрикой потоков.
Параметры:
corePoolSize - число потоков, которое нужно поддерживать в пуле, даже если они бездействуют, если не установлено allowCoreThreadTimeOut
maximumPoolSize - максимальное число потоков, разрешённое в пуле
keepAliveTime - если число потоков больше базового, это максимальное время, которое избыточные бездействующие потоки будут ожидать новых задач перед завершением.
unit - единица измерения времени для аргумента keepAliveTime
workQueue - очередь для хранения задач перед их выполнением. Эта очередь будет содержать только Runnable задачи, отправленные методом execute.
handler - обработчик, используемый при блокировке выполнения из-за достижения пределов потоков и вместимости очереди
Исключения:
IllegalArgumentException - если выполняется одно из следующих условий:
corePoolSize < 0
keepAliveTime < 0
maximumPoolSize <= 0
maximumPoolSize < corePoolSize
NullPointerException - если workQueue или handler равны null

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами.
Параметры:
corePoolSize - число потоков, которое нужно поддерживать в пуле, даже если они бездействуют, если не установлено allowCoreThreadTimeOut
maximumPoolSize - максимальное число потоков, разрешённое в пуле
keepAliveTime - если число потоков больше базового, это максимальное время, которое избыточные бездействующие потоки будут ожидать новых задач перед завершением.
unit - единица измерения времени для аргумента keepAliveTime
workQueue - очередь для хранения задач перед их выполнением. Эта очередь будет содержать только Runnable задачи, отправленные методом execute.
threadFactory - фабрика, используемая при создании нового потока исполнителем
handler - обработчик, используемый при блокировке выполнения из-за достижения пределов потоков и вместимости очереди
Исключения:
IllegalArgumentException - если выполняется одно из следующих условий:
corePoolSize < 0
keepAliveTime < 0
maximumPoolSize <= 0
maximumPoolSize < corePoolSize
NullPointerException - если workQueue или threadFactory или handler равны null

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

execute

public void execute(Runnable command)
Выполняет заданную задачу в будущем. Задача может выполняться в новом потоке или в уже существующем пуловом потоке. Если задачу нельзя отправить на выполнение, либо из-за остановки этого исполнителя, либо из-за достижения его ёмкости, задача обрабатывается текущим RejectedExecutionHandler.
Параметры:
command - задача для выполнения
Исключения:
RejectedExecutionException - по усмотрению RejectedExecutionHandler, если задачу нельзя принять для выполнения
NullPointerException - если command равно null

shutdown

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

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

Исключения:
SecurityException - если существует менеджер безопасности и остановка этого ExecutorService может манипулировать потоками, которые вызывающий компонент не имеет права изменять, поскольку у него нет RuntimePermission("modifyThread"), или метод checkAccess менеджера безопасности запрещает доступ.

shutdownNow

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

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

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

Возвращает:
список задач, которые никогда не начинали выполнение
Исключения:
SecurityException - если существует менеджер безопасности и остановка этого ExecutorService может манипулировать потоками, которые вызывающий компонент не имеет права изменять, поскольку у него нет RuntimePermission("modifyThread"), или метод checkAccess менеджера безопасности запрещает доступ.

isShutdown

public boolean isShutdown()
Описание скопировано из интерфейса: ExecutorService
Возвращает true, если этот исполнитель был остановлен.
Возвращает:
true если этот исполнитель был остановлен

isTerminating

public boolean isTerminating()
Возвращает true, если этот исполнитель находится в процессе завершения после shutdown() или shutdownNow(), но ещё не завершился полностью. Этот метод может быть полезен для отладки. Возврат true через достаточный промежуток времени после остановки может указывать на то, что отправленные задачи игнорируют или подавляют прерывание, из-за чего этот исполнитель не завершается должным образом.
Возвращает:
true если завершается, но ещё не завершён

isTerminated

public boolean isTerminated()
Описание скопировано из интерфейса: ExecutorService
Возвращает true, если все задачи завершены после остановки. Обратите внимание, что isTerminated никогда не true , если не был вызван ни shutdown, ни shutdownNow.
Возвращает:
true если все задачи завершены после остановки

awaitTermination

public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
Description copied from interface: ExecutorService
Ожидает завершения всех задач после запроса остановки, истечения таймаута или прерывания текущей нити — в зависимости от того, что произойдёт раньше.
Parameters:
timeout - максимальное время ожидания
unit - единица измерения времени таймаута
Returns:
true если этот исполняющий механизм завершил работу и false если таймаут истек до завершения
Throws:
InterruptedException - если ожидание было прервано

finalize

@Deprecated(since="9", forRemoval=true) protected void finalize()
Устарело, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Метод finalize устарел и подлежит удалению. См. Object.finalize() для получения дополнительной информации и деталей по вариантам миграции.
Description copied from class: Object
Вызывается сборщиком мусора для объекта, когда сборка мусора определяет, что к объекту больше нет ссылок. Подкласс переопределяет метод finalize, чтобы освободить системные ресурсы или выполнить другую очистку.

При выполнении в виртуальной машине Java, в которой финализация отключена или удалена, сборщик мусора никогда не вызовет finalize(). В виртуальной машине Java, в которой финализация включена, сборщик мусора может вызвать finalize только после неопределённой задержки.

Общий контракт метода finalize заключается в том, что он вызывается тогда и только тогда, когда виртуальная машина Java определила, что к этому объекту больше нет доступа ни одной нити, которая ещё не завершила работу, за исключением случаев, когда это произошло в результате действия финализации какого-либо другого объекта или класса, готового к финализации. Метод finalize может выполнить любые действия, включая повторную доступность этого объекта для других нитей; однако, обычное назначение метода finalize — выполнить действия по очистке перед окончательным удалением объекта. Например, метод finalize для объекта, представляющего соединение ввода/вывода, может выполнить явные операции ввода/вывода, чтобы разорвать соединение перед окончательным удалением объекта.

Метод finalize класса Object не выполняет никаких специальных действий; он просто возвращается в нормальное состояние. Подклассы Object могут переопределить это определение.

Язык программирования Java не гарантирует, какая нить вызовет метод finalize для любого заданного объекта. Однако гарантируется, что нить, вызывающая finalize, не будет удерживать какие-либо видимые пользователю блокировки синхронизации при вызове finalize. Если метод finalize выбросит необработанное исключение, исключение игнорируется, и финализация этого объекта завершается.

После вызова метода finalize для объекта никаких дальнейших действий не предпринимается до тех пор, пока виртуальная машина Java вновь не определит, что к этому объекту больше нет доступа ни одной нити, которая ещё не завершила работу, включая возможные действия других объектов или классов, готовых к финализации, в этот момент объект может быть удалён.

Метод finalize никогда не вызывается виртуальной машиной Java более одного раза для любого данного объекта.

Любое исключение, выброшенное методом finalize , приводит к остановке финализации этого объекта, но в остальном игнорируется.

Overrides:
finalize в классе Object
Implementation Note:
Предыдущие версии этого класса имели метод finalize, который останавливал этот исполняющий механизм, но в этой версии finalize ничего не делает.
See Also:
  • WeakReference
  • PhantomReference

setThreadFactory

public void setThreadFactory(ThreadFactory threadFactory)
Устанавливает фабрику нитей, используемую для создания новых нитей.
Parameters:
threadFactory - новая фабрика нитей
Throws:
NullPointerException - если threadFactory равно null
See Also:
  • getThreadFactory()

getThreadFactory

public ThreadFactory getThreadFactory()
Возвращает фабрику нитей, используемую для создания новых нитей.
Returns:
текущая фабрика нитей
See Also:
  • setThreadFactory(ThreadFactory)

setRejectedExecutionHandler

public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
Устанавливает новый обработчик для невыполнимых задач.
Parameters:
handler - новый обработчик
Throws:
NullPointerException - если handler равно null
See Also:
  • getRejectedExecutionHandler()

getRejectedExecutionHandler

public RejectedExecutionHandler getRejectedExecutionHandler()
Возвращает текущий обработчик для невыполнимых задач.
Returns:
текущий обработчик
See Also:
  • setRejectedExecutionHandler(RejectedExecutionHandler)

setCorePoolSize

public void setCorePoolSize(int corePoolSize)
Устанавливает базовое количество потоков. Это переопределяет любое значение, заданное в конструкторе. Если новое значение меньше текущего, избыточные существующие потоки будут завершены при их следующем простаивании. Если больше, новые потоки будут, при необходимости, запущены для выполнения любых ожидающих задач.
Parameters:
corePoolSize - новое базовое количество
Throws:
IllegalArgumentException - если corePoolSize < 0 или corePoolSize больше, чем максимальное количество потоков
See Also:
  • getCorePoolSize()

getCorePoolSize

public int getCorePoolSize()
Возвращает базовое количество потоков.
Returns:
базовое количество потоков
See Also:
  • setCorePoolSize(int)

prestartCoreThread

public boolean prestartCoreThread()
Запускает базовый поток, заставляя его бездействовать и ждать работы. Это переопределяет стандартную политику запуска базовых потоков только при выполнении новых задач. Этот метод вернёт false если все базовые потоки уже были запущены.
Returns:
true если поток был запущен

prestartAllCoreThreads

public int prestartAllCoreThreads()
Запускает все базовые потоки, заставляя их бездействовать и ждать работы. Это переопределяет стандартную политику запуска базовых потоков только при выполнении новых задач.
Returns:
количество запущенных потоков

allowsCoreThreadTimeOut

public boolean allowsCoreThreadTimeOut()
Возвращает true, если этот пул позволяет базовым потокам истекать и завершаться, если в течение времени keep-alive не поступают задачи, при необходимости заменяясь при поступлении новых задач. При значении true, та же политика keep-alive, применяемая к не-базовым потокам, применяется и к базовым потокам. При значении false (по умолчанию) базовые потоки никогда не завершаются из-за отсутствия входящих задач.
Returns:
true если базовые потоки разрешено истекать, иначе false
Since:
1.6

allowCoreThreadTimeOut

public void allowCoreThreadTimeOut(boolean value)
Устанавливает политику, определяющую, могут ли базовые потоки истекать и завершаться, если в течение времени keep-alive не поступают задачи, при необходимости заменяясь при поступлении новых задач. При значении false, базовые потоки никогда не завершаются из-за отсутствия входящих задач. При значении true, та же политика keep-alive, применяемая к не-базовым потокам, применяется и к базовым потокам. Для предотвращения непрерывной замены потоков время keep-alive должно быть больше нуля при установке true. Этот метод в общем случае следует вызывать до активного использования пула.
Parameters:
value - true если нужно истекать, иначе false
Throws:
IllegalArgumentException - если значение равно true и текущее время keep-alive не больше нуля
Since:
1.6

setMaximumPoolSize

public void setMaximumPoolSize(int maximumPoolSize)
Устанавливает максимальное допустимое количество потоков. Это переопределяет любое значение, заданное в конструкторе. Если новое значение меньше текущего, избыточные существующие потоки будут завершены при их следующем простаивании.
Parameters:
maximumPoolSize - новое максимальное значение
Throws:
IllegalArgumentException - если новое максимальное значение меньше или равно нулю, или меньше базового количества потоков
See Also:
  • getMaximumPoolSize()

getMaximumPoolSize

public int getMaximumPoolSize()
Возвращает максимальное допустимое количество потоков.
Returns:
максимальное допустимое количество потоков
See Also:
  • setMaximumPoolSize(int)

Установить время ожидания активных потоков

public void setKeepAliveTime(long time, TimeUnit unit)
Устанавливает время ожидания активных потоков, которое определяет длительность периода бездействия потоков перед их завершением. Потоки, ожидающие в течение этого времени без обработки задачи, будут завершены, если в пуле активных потоков больше, чем ядро, или если в этом пуле разрешено время ожидания основных потоков. Это переопределяет любое значение, заданное в конструкторе.
Параметры:
time - время ожидания. Значение времени, равное нулю, приведет к немедленному завершению избыточных потоков после выполнения задач.
unit - единица измерения времени для аргумента time
Исключения:
IllegalArgumentException - если time меньше нуля, или если time равно нулю, и allowsCoreThreadTimeOut
См. также:
  • getKeepAliveTime(TimeUnit)

Получить время ожидания активных потоков

public long getKeepAliveTime(TimeUnit unit)
Возвращает время ожидания активных потоков, которое определяет длительность периода бездействия потоков перед их завершением. Потоки, ожидающие в течение этого времени без обработки задачи, будут завершены, если в пуле активных потоков больше, чем ядро, или если в этом пуле разрешено время ожидания основных потоков.
Параметры:
unit - желаемая единица измерения времени результата
Возвращает:
предельный срок
См. также:
  • setKeepAliveTime(long, TimeUnit)

Получить очередь задач

public BlockingQueue<Runnable> getQueue()
Возвращает очередь задач, используемую этим исполнителем. Доступ к очереди задач предназначен в первую очередь для отладки и мониторинга. Эта очередь может быть в активном использовании. Получение очереди задач не препятствует выполнению задач в очереди.
Возвращает:
очередь задач

Удалить

public boolean remove(Runnable task)
Удаляет задачу из внутренней очереди исполнителя, если она присутствует, тем самым предотвращая ее выполнение, если она еще не началась.

Этот метод может быть полезен как часть схемы отмены. Он может не удалять задачи, которые были преобразованы в другие формы до размещения в внутренней очереди. Например, задача, введенная с использованием submit, может быть преобразована в форму, которая сохраняет статус Future. Однако в таких случаях может использоваться метод purge() для удаления тех объектов Future, которые были отменены.

Параметры:
task - задача для удаления
Возвращает:
true если задача была удалена

Очистить

public void purge()
Попытка удалить из очереди все задачи Future, которые были отменены. Этот метод может быть полезен как операция по освобождению памяти, которая не оказывает никакого другого влияния на функциональность. Отмененные задачи никогда не выполняются, но могут накапливаться в очередях, пока потоки-работники не смогут их удалить. Вызов этого метода вместо этого попытается удалить их сейчас. Однако этот метод может не удалять задачи при наличии помех со стороны других потоков.

Получить размер пула потоков

public int getPoolSize()
Возвращает текущее количество потоков в пуле.
Возвращает:
количество потоков

Получить количество активных потоков

public int getActiveCount()
Возвращает приблизительное количество потоков, которые активно выполняют задачи.
Возвращает:
количество потоков

Получить максимальный размер пула потоков

public int getLargestPoolSize()
Возвращает максимальное количество потоков, которые одновременно находились в пуле.
Возвращает:
количество потоков

Получить количество задач

public long getTaskCount()
Возвращает приблизительное общее количество задач, которые когда-либо были запланированы для выполнения. Поскольку состояния задач и потоков могут динамически изменяться во время вычислений, возвращаемое значение является лишь приблизительным.
Возвращает:
количество задач

Получить количество завершенных задач

public long getCompletedTaskCount()
Возвращает приблизительное общее количество задач, которые завершили выполнение. Поскольку состояния задач и потоков могут динамически изменяться во время вычислений, возвращаемое значение является лишь приблизительным, но оно никогда не уменьшается при последовательных вызовах.
Возвращает:
количество задач

toString

public String toString()
Возвращает строку, идентифицирующую этот пул, а также его состояние, включая указания на состояние выполнения и оценочное количество рабочих потоков и задач.
Переопределяет:
toString в классе Object
Возвращает:
строка, идентифицирующая этот пул, а также его состояние

beforeExecute

protected void beforeExecute(Thread t, Runnable r)
Метод, вызываемый перед выполнением заданного Runnable в заданном потоке. Этот метод вызывается потоком t, который выполнит задачу r, и может использоваться для повторной инициализации ThreadLocals или для выполнения регистрации.

Эта реализация ничего не делает, но может быть настраиваемой в подклассах. Примечание. Для правильного вложенного переопределения подклассы, как правило, должны вызывать super.beforeExecute в конце этого метода.

Параметры:
t - поток, который выполнит задачу r
r - задача, которая будет выполнена

afterExecute

protected void afterExecute(Runnable r, Throwable t)
Метод, вызываемый по завершении выполнения заданного Runnable. Этот метод вызывается потоком, который выполнил задачу. Если не null, Throwable — это необработанное RuntimeException или Error, которое привело к преждевременному завершению выполнения.

Эта реализация ничего не делает, но может быть настраиваемой в подклассах. Примечание. Для правильного вложенного переопределения подклассы, как правило, должны вызывать super.afterExecute в начале этого метода.

Примечание: Когда действия заключены в задачи (например, FutureTask) явно или через методы, такие как submit, эти объекты задач ловят и сохраняют вычислительные исключения, поэтому они не вызывают преждевременного завершения, и внутренние исключения не передаются в этот метод. Если вы хотите поймать оба типа ошибок в этом методе, вы можете дополнительно проверить такие случаи, как в этом примере подкласса, который выводит либо непосредственную причину, либо основное исключение, если задача была прервана:

 
 class ExtendedExecutor extends ThreadPoolExecutor {
   // ...
   protected void afterExecute(Runnable r, Throwable t) {
     super.afterExecute(r, t);
     if (t == null
         && r instanceof Future<?>
         && ((Future<?>)r).isDone()) {
       try {
         Object result = ((Future<?>) r).get();
       } catch (CancellationException ce) {
         t = ce;
       } catch (ExecutionException ee) {
         t = ee.getCause();
       } catch (InterruptedException ie) {
         // ignore/reset
         Thread.currentThread().interrupt();
       }
     }
     if (t != null)
       System.out.println(t);
   }
 }
Параметры:
r - Runnable, который завершил выполнение
t - исключение, вызвавшее завершение, или null, если выполнение завершилось нормально

terminated

protected void terminated()
Метод, вызываемый при завершении исполнителя. Реализация по умолчанию ничего не делает. Примечание. Для правильного вложенного переопределения подклассы, как правило, должны вызывать super.terminated в этом методе.

© 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/ThreadPoolExecutor.html

Spec-Zone.ru

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