Spec-Zone.ru › OpenJDK 17

Класс ThreadPoolExecutor

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

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

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

Основные и максимальные размеры пула
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 потоков, исполнитель всегда предпочитает добавление нового потока, а не помещение в очередь.
  • Если запущено corePoolSize или больше потоков, исполнитель всегда предпочитает помещение запроса в очередь, а не добавление нового потока.
  • Если запрос не может быть помещен в очередь, создается новый поток, если это не превысит maximumPoolSize, в противном случае задача будет отклонена.
Существует три общих стратегии для очереди:
  1. Прямые передачи. Хорошим выбором для очереди задач является SynchronousQueue, которая передает задачи потокам без дополнительного удержания. Здесь попытка поместить задачу в очередь завершится неудачей, если потоки не готовы к ее выполнению, поэтому будет создан новый поток. Эта политика позволяет избежать блокировок при обработке наборов запросов, которые могут иметь внутренние зависимости. Прямые передачи обычно требуют неограниченных maximumPoolSizes, чтобы избежать отклонения новых отправленных задач. Это, в свою очередь, допускает возможность неограниченного роста потоков, когда команды поступают в среднем быстрее, чем могут быть обработаны.
  2. Неограниченные очереди. Использование неограниченной очереди (например, LinkedBlockingQueue без предварительно определенной емкости) приведет к тому, что новые задачи будут ожидать в очереди, когда все потоки corePoolSize заняты. Таким образом, будет создано не более corePoolSize потоков. (И значение maximumPoolSize, следовательно, не оказывает никакого влияния.) Это может быть уместно, когда каждая задача полностью независима от других, поэтому задачи не могут влиять друг на друга во время выполнения; например, в веб-сервере. Хотя этот стиль очереди может быть полезен для сглаживания кратковременных всплесков запросов, он допускает возможность неограниченного роста очереди задач, когда команды продолжают поступать в среднем быстрее, чем могут быть обработаны.
  3. Ограниченные очереди. Ограниченная очередь (например, ArrayBlockingQueue) помогает предотвратить истощение ресурсов при использовании конечных maximumPoolSizes, но может быть сложнее настроить и контролировать. Размеры очереди и максимальные размеры пула могут быть изменены друг на друга: Использование больших очередей и небольших пулов сводит к минимуму использование процессора, системных ресурсов и переключения контекста, но может привести к искусственно низкой пропускной способности. Если задачи часто блокируются (например, если они привязаны к вводу-выводу), система может планировать время для большего количества потоков, чем вы иначе разрешаете. Использование небольших очередей обычно требует больших размеров пула, что удерживает процессоры более загруженными, но может столкнуться с неприемлемой перегрузкой планирования, что также снижает пропускную способность.
Отклоненные задачи
Новые задачи, отправленные в метод execute(Runnable), будут отклонены, когда исполнитель был остановлен, а также когда исполнитель использует конечные границы как для максимального числа потоков, так и для емкости очереди задач, и насыщен. В любом случае, метод execute вызывает метод RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor) своего RejectedExecutionHandler. Предоставляются четыре предопределенные политики обработчика:
  1. В стандартной ThreadPoolExecutor.AbortPolicy, обработчик выбрасывает исключение времени выполнения RejectedExecutionException при отклонении.
  2. В ThreadPoolExecutor.CallerRunsPolicy, поток, вызывающий execute, сам выполняет задачу. Это обеспечивает простую механизм управления обратной связью, который замедлит скорость отправки новых задач.
  3. В ThreadPoolExecutor.DiscardPolicy, задача, которую невозможно выполнить, просто отбрасывается. Эта политика предназначена только для тех редких случаев, когда завершение задачи никогда не используется.
  4. В ThreadPoolExecutor.DiscardOldestPolicy, если исполнитель не остановлен, задача в начале очереди задач отбрасывается, а затем выполнение повторяется (что может снова завершиться неудачей, что приведет к повторению). Эта политика редко приемлема. Почти во всех случаях вы также должны отменить задачу, чтобы вызвать исключение в любом компоненте, ожидающем ее завершения, и/или записать об ошибке, как показано в документации к ThreadPoolExecutor.DiscardOldestPolicy.
Возможно определить и использовать другие виды RejectedExecutionHandler классов. Для этого требуется определённая внимательность, особенно когда политики предназначены для работы только при определенных емкостях или политиках очереди.
Методы-обработчики
Этот класс предоставляет protected переопределяемые beforeExecute(Thread, Runnable) и afterExecute(Runnable, Throwable) методы, которые вызываются до и после выполнения каждой задачи. Они могут использоваться для манипулирования средой выполнения; например, для повторной инициализации ThreadLocals, сбора статистики или добавления записей в журнал. Кроме того, метод terminated() может быть переопределён для выполнения любой специальной обработки, которая должна быть выполнена после того, как исполнитель полностью завершит работу.

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

Управление очередью
Метод getQueue() позволяет получить доступ к очереди задач для целей мониторинга и отладки. Использование этого метода для любых других целей крайне не рекомендуется. Два предоставленных метода, remove(Runnable) и purge(), доступны для помощи в освобождении памяти при отмене большого числа задач в очереди.
Освобождение ресурсов
Пул, на который больше нет ссылок в программе И у которого нет оставшихся потоков, может быть освобожден (сбор мусора) без явного закрытия. Вы можете настроить пул таким образом, чтобы все неиспользуемые потоки в конечном итоге погибли, установив соответствующие значения keep-alive, используя нижнюю границу нулевых основных потоков и/или установив 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)
Устанавливает политику, управляющую тем, могут ли основные потоки отключаться и завершаться, если в течение времени keep-alive не поступают задачи, заменяясь при необходимости при поступлении новых задач.
boolean allowsCoreThreadTimeOut()
Возвращает true, если в этом пуле основные потоки могут отключаться и завершаться, если в течение времени keepAlive не поступают задачи, заменяясь при необходимости при поступлении новых задач.
boolean awaitTermination(long timeout, TimeUnit unit)
Ожидает завершения всех задач после запроса остановки, или истечения тайм-аута, или прерывания текущего потока — в зависимости от того, что произойдёт первым.
protected void beforeExecute(Thread t, Runnable r)
Метод, вызываемый перед выполнением заданного Runnable в данном потоке.
void execute(Runnable command)
Выполняет заданную задачу в будущем.
protected void finalize()
Устарело.
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

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

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

finalize

@Deprecated(since="9") protected void finalize()
Устарело.
Описание, скопированное из класса: Object
Вызывается сборщиком мусора для объекта, когда сборка мусора определяет, что к объекту больше нет ссылок. Подкласс переопределяет метод 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, если в этом пуле разрешено время ожидания основных потоков и их завершение, если в течение времени keepAlive не поступают задачи, при необходимости заменяемые новыми задачами. Если значение true, то политика keep-alive, применяемая к неглавным потокам, также применяется к основным потокам. Если значение false (по умолчанию), основные потоки никогда не завершаются из-за отсутствия входящих задач.
Возвращает:
true если основные потоки могут истечь, иначе false
Since:
1.6

allowCoreThreadTimeOut

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

setMaximumPoolSize

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

getMaximumPoolSize

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

setKeepAliveTime

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

getKeepAliveTime

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

getQueue

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

remove

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

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

Parameters:
task - задача для удаления
Returns:
true если задача была удалена

purge

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

getPoolSize

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

getActiveCount

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

getLargestPoolSize

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

getTaskCount

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

getCompletedTaskCount

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

toString

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

beforeExecute

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

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

Parameters:
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);
   }
 }
Parameters:
r - Runnable, который завершил выполнение
t - исключение, вызвавшее завершение, или null, если выполнение завершилось нормально

terminated

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

© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html

Spec-Zone.ru

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