Spec-Zone.ru › OpenJDK 24

Класс 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 приоритет и статус не-daemon. Предоставляя другой ThreadFactory, вы можете изменить имя потока, группу потоков, приоритет, статус daemon и т. д. Если 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, обработчик выбрасывает исключение времени выполнения 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();
     }
   }
 }
Since:
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 для этого.

shutdownNow

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

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

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

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

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
Описание скопировано из интерфейса: ExecutorService
Ожидает завершения всех задач после запроса завершения, или истечения таймаута, или прерывания текущего потока, в зависимости от того, что произойдет раньше.
Параметры:
timeout - максимальное время ожидания
unit - единица измерения времени для аргумента таймаута
Возвращает:
true если этот выполнител завершился и false если таймаут истек до завершения
Исключения:
InterruptedException - если ожидание было прервано

finalize

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

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

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

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

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

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

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

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

Переопределяет:
finalize в классе Object
Примечание к реализации:
Предыдущие версии этого класса имели метод finalize, который завершал работу этого исполнителя, но в этой версии finalize ничего не делает.
См. также:
  • WeakReference
  • PhantomReference

setThreadFactory

public void setThreadFactory(ThreadFactory threadFactory)
Устанавливает фабрику потоков, используемую для создания новых потоков.
Параметры:
threadFactory - новая фабрика потоков
Исключения:
NullPointerException - если threadFactory равно null
См. также:
  • getThreadFactory()

getThreadFactory

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

setRejectedExecutionHandler

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

getRejectedExecutionHandler

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

setCorePoolSize

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

getCorePoolSize

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

prestartCoreThread

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

prestartAllCoreThreads

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

allowsCoreThreadTimeOut

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

allowCoreThreadTimeOut

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

setMaximumPoolSize

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

МаксимальнаяЁмкостьПула

public int getMaximumPoolSize()
Возвращает максимальное допустимое количество потоков.
Возвращает:
максимальное допустимое количество потоков
См. также:
  • 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() для удаления тех задач, которые были отменены.

Параметры:
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, если выполнение завершилось нормально

Завершено

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

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html

Spec-Zone.ru

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