Класс ThreadPoolExecutor
- Все реализуемые интерфейсы:
AutoCloseable, 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не удаётся создать поток по запросу и методnewThreadвозвращает null, исполнитель продолжит работу, но может оказаться неспособным выполнять какие-либо задачи. - Время ожидания перед завершением
- Если в пуле сейчас больше потоков, чем задано параметром corePoolSize, избыточные потоки будут завершены, если они простаивали дольше, чем указано параметром keepAliveTime (см.
getKeepAliveTime(TimeUnit)). Это позволяет сократить потребление ресурсов, когда пул не используется активно. Если позднее нагрузка на пул возрастёт, будут созданы новые потоки. Этот параметр также можно динамически изменять с помощью методаsetKeepAliveTime(long, TimeUnit). ЗначениеLong.MAX_VALUETimeUnit.NANOSECONDSфактически отключает завершение простаивающих потоков до остановки пула. По умолчанию политика ожидания перед завершением применяется только тогда, когда потоков больше, чем задано параметром corePoolSize, но методallowCoreThreadTimeOut(boolean)позволяет применять эту политику также к основным потокам, если значение keepAliveTime не равно нулю. - Постановка в очередь
- Для передачи и хранения отправленных задач можно использовать любую
BlockingQueue. Использование этой очереди влияет на размер пула:- Если работает меньше потоков, чем задано параметром corePoolSize, исполнитель всегда предпочитает добавить новый поток, а не помещать задачу в очередь.
- Если работает столько же потоков или больше, чем задано параметром corePoolSize, исполнитель всегда предпочитает поместить запрос в очередь, а не добавлять новый поток.
- Если запрос нельзя поместить в очередь, создаётся новый поток, если это не приведёт к превышению maximumPoolSize; в противном случае задача будет отклонена.
-
Непосредственная передача. Хорошим вариантом очереди работ по умолчанию является
SynchronousQueue, которая передаёт задачи потокам, не сохраняя их. В этом случае попытка поместить задачу в очередь завершится неудачей, если немедленно доступных для её выполнения потоков нет, поэтому будет создан новый поток. Эта политика предотвращает взаимные блокировки при обработке наборов запросов, которые могут иметь внутренние зависимости. Для непосредственной передачи обычно требуется неограниченное значение maximumPoolSize, чтобы избежать отклонения новых отправленных задач. Это, в свою очередь, допускает неограниченный рост числа потоков, если команды продолжают поступать в среднем быстрее, чем их можно обрабатывать. -
Неограниченные очереди. Использование неограниченной очереди (например,
LinkedBlockingQueueбез заранее заданной ёмкости) приводит к тому, что новые задачи ожидают в очереди, когда все потоки corePoolSize заняты. Таким образом, число созданных потоков никогда не превысит corePoolSize. (Поэтому значение maximumPoolSize не будет иметь никакого эффекта.) Этот вариант может быть уместен, если каждая задача полностью независима от остальных и задачи не могут влиять на выполнение друг друга, например на сервере веб-страниц. Такой способ постановки в очередь позволяет сглаживать кратковременные всплески запросов, но допускает неограниченный рост очереди работ, если команды продолжают поступать в среднем быстрее, чем их можно обрабатывать. -
Ограниченные очереди. Ограниченная очередь (например,
ArrayBlockingQueue) помогает предотвратить исчерпание ресурсов при использовании конечного значения maximumPoolSize, но её настройка и управление могут быть сложнее. Размер очереди и максимальный размер пула можно подбирать совместно: большие очереди и небольшие пулы сводят к минимуму использование процессора и ресурсов ОС, а также накладные расходы на переключение контекста, но могут привести к искусственно низкой пропускной способности. Если задачи часто блокируются (например, при интенсивном вводе-выводе), система может выделить время для большего числа потоков, чем вы обычно допускаете. Использование небольших очередей, как правило, требует увеличения размера пула, что позволяет эффективнее загружать процессоры, но может привести к неприемлемым накладным расходам на планирование и, как следствие, снизить пропускную способность.
- Отклонённые задачи
- Новые задачи, отправленные методом
execute(Runnable), будут отклонены, если исполнитель остановлен, а также если исполнитель использует конечные ограничения как на максимальное число потоков, так и на ёмкость очереди работ и эти ограничения достигнуты. В любом из этих случаев методexecuteвызывает методRejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor)своегоRejectedExecutionHandler. Предусмотрены четыре стандартные политики обработки:- При использовании стандартной политики
ThreadPoolExecutor.AbortPolicyобработчик при отклонении выбрасывает исключение времени выполненияRejectedExecutionException. - При использовании
ThreadPoolExecutor.CallerRunsPolicyпоток, вызывающий сам методexecute, выполняет задачу. Это обеспечивает простой механизм обратной связи, замедляющий отправку новых задач. - При использовании
ThreadPoolExecutor.DiscardPolicyзадачу, которую нельзя выполнить, просто отбрасывают. Эта политика предназначена только для редких случаев, когда завершение задач не имеет значения. - При использовании
ThreadPoolExecutor.DiscardOldestPolicy, если исполнитель не остановлен, отбрасывается задача в начале очереди работ, после чего выполняется повторная попытка (которая может снова завершиться неудачей, и тогда процесс повторится). Эта политика редко бывает приемлемой. Почти во всех случаях следует также отменить задачу, чтобы вызвать исключение в любом компоненте, ожидающем её завершения, и/или записать сведения о сбое в журнал, как показано в документацииThreadPoolExecutor.DiscardOldestPolicy.
RejectedExecutionHandler. Для этого требуется соблюдать осторожность, особенно если политики рассчитаны на работу только при определённых ограничениях ёмкости или стратегиях постановки в очередь. - При использовании стандартной политики
- Методы-перехватчики
- Этот класс предоставляет
protectedпереопределяемые методыbeforeExecute(Thread, Runnable)иafterExecute(Runnable, Throwable), которые вызываются до и после выполнения каждой задачи. Их можно использовать для изменения среды выполнения, например для повторной инициализации ThreadLocal, сбора статистики или добавления записей в журнал. Кроме того, методterminated()можно переопределить для выполнения специальных действий после полной остановки исполнителя.Если методы-перехватчики, методы обратного вызова или методы 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 |
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами, стандартной фабрикой потоков и стандартным обработчиком отклонённых задач. |
ThreadPoolExecutor |
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и стандартной фабрикой потоков. |
ThreadPoolExecutor |
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами и стандартным обработчиком отклонённых задач. |
ThreadPoolExecutor |
Создаёт новый ThreadPoolExecutor с заданными начальными параметрами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
afterExecute |
Метод, вызываемый после завершения выполнения заданного Runnable. |
void |
allowCoreThreadTimeOut |
Задаёт политику, определяющую, могут ли основные потоки завершаться по истечении времени ожидания, если за это время не поступают задачи; при необходимости такие потоки заменяются при поступлении новых задач. |
boolean |
allowsCoreThreadTimeOut() |
Возвращает true, если этот пул позволяет основным потокам завершаться по истечении времени ожидания keepAlive, когда за это время не поступают задачи; при необходимости такие потоки заменяются при поступлении новых задач. |
boolean |
awaitTermination |
Блокирует выполнение до завершения всех задач после запроса остановки, истечения времени ожидания или прерывания текущего потока — в зависимости от того, что произойдёт раньше. |
protected void |
beforeExecute |
Метод, вызываемый перед выполнением заданного Runnable в заданном потоке. |
void |
execute |
Выполняет заданную задачу в будущем. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии. Финализация признана устаревшей и планируется к удалению. |
int |
getActiveCount() |
Возвращает приблизительное число потоков, активно выполняющих задачи. |
long |
getCompletedTaskCount() |
Возвращает приблизительное общее число задач, выполнение которых завершено. |
int |
getCorePoolSize() |
Возвращает число основных потоков. |
long |
getKeepAliveTime |
Возвращает время ожидания перед завершением потока — время, в течение которого потоки могут простаивать до завершения. |
int |
getLargestPoolSize() |
Возвращает наибольшее число потоков, когда-либо одновременно находившихся в пуле. |
int |
getMaximumPoolSize() |
Возвращает максимально допустимое число потоков. |
int |
getPoolSize() |
Возвращает текущее число потоков в пуле. |
BlockingQueue |
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 |
Удаляет эту задачу из внутренней очереди исполнителя, если она там присутствует, не позволяя ей выполниться, если выполнение ещё не началось. |
void |
setCorePoolSize |
Задаёт число основных потоков. |
void |
setKeepAliveTime |
Задаёт время ожидания перед завершением потока — время, в течение которого потоки могут простаивать до завершения. |
void |
setMaximumPoolSize |
Задаёт максимально допустимое число потоков. |
void |
setRejectedExecutionHandler |
Задаёт новый обработчик невыполнимых задач. |
void |
setThreadFactory |
Задаёт фабрику потоков, используемую для создания новых потоков. |
void |
shutdown() |
Инициирует штатную остановку: ранее отправленные задачи выполняются, но новые задачи больше не принимаются. |
List |
shutdownNow() |
Пытается остановить все активно выполняющиеся задачи, прекращает обработку ожидающих задач и возвращает список задач, ожидавших выполнения. |
protected void |
terminated() |
Метод, вызываемый после завершения работы исполнителя. |
String |
toString() |
Возвращает строку, идентифицирующую этот пул и его состояние, в том числе сведения о состоянии выполнения и примерном количестве рабочих потоков и задач. |
Методы, объявленные в классе AbstractExecutorService
invokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submit
Методы, объявленные в классе Object
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
Методы, объявленные в интерфейсе 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()
ExecutorServicetrue, если работа этого исполнителя завершена.- Возвращает:
-
true, если работа этого исполнителя завершена
isTerminating
public boolean isTerminating()
shutdown() или shutdownNow(), но еще не завершил работу. Этот метод может быть полезен при отладке. Если через достаточный промежуток времени после завершения работы метод возвращает true, это может означать, что отправленные задачи проигнорировали или подавили прерывание, из-за чего исполнитель не может корректно завершить работу.- Возвращает:
-
true, если завершение работы началось, но еще не закончилось
isTerminated
public boolean isTerminated()
ExecutorServicetrue, если после завершения работы все задачи были выполнены. Обратите внимание: 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()
Object.finalize().Objectfinalize, чтобы освободить системные ресурсы или выполнить другую очистку. В виртуальной машине Java, в которой финализация отключена или удалена, сборщик мусора никогда не вызовет finalize(). В виртуальной машине Java, в которой финализация включена, сборщик мусора может вызвать finalize лишь через неопределенный промежуток времени.
Общее правило для finalize состоит в том, что этот метод вызывается тогда и только тогда, когда виртуальная машина Java определит, что больше нет способа получить доступ к данному объекту из любого еще не завершившего работу потока, кроме как в результате действия, выполненного при финализации другого объекта или класса, готового к финализации. Метод finalize может выполнять любые действия, в том числе снова сделать объект доступным для других потоков; однако обычное назначение finalize — выполнить очистку до того, как объект будет окончательно удален. Например, метод finalize объекта, представляющего подключение ввода-вывода, может явно выполнить операции ввода-вывода, чтобы разорвать подключение до окончательного удаления объекта.
Метод finalize класса Object не выполняет никаких специальных действий и просто нормально возвращает управление. Подклассы Object могут переопределять это определение.
Язык программирования Java не гарантирует, какой поток вызовет метод finalize для того или иного объекта. Однако гарантируется, что поток, вызывающий finalize, не будет удерживать никаких видимых пользователю блокировок синхронизации в момент вызова finalize. Если метод finalize выбрасывает неперехваченное исключение, оно игнорируется, а финализация этого объекта прекращается.
После вызова метода finalize для объекта никаких дальнейших действий не предпринимается, пока виртуальная машина Java снова не определит, что больше нет способа получить доступ к этому объекту из любого еще не завершившего работу потока. При этом учитываются возможные действия других объектов или классов, готовых к финализации. После этого объект может быть удален.
Виртуальная машина Java никогда не вызывает метод finalize для одного и того же объекта более одного раза.
Любое исключение, выброшенное методом finalize, приводит к прекращению финализации этого объекта, но в остальном игнорируется.
setThreadFactory
public void setThreadFactory(ThreadFactory threadFactory)
- Параметры:
-
threadFactory— новая фабрика потоков - Исключения:
-
NullPointerException— если threadFactory равно null - См. также:
getThreadFactory
public ThreadFactory getThreadFactory()
- Возвращает:
- текущая фабрика потоков
- См. также:
setRejectedExecutionHandler
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)
- Параметры:
-
handler— новый обработчик - Исключения:
-
NullPointerException— если handler равно null - См. также:
getRejectedExecutionHandler
public RejectedExecutionHandler getRejectedExecutionHandler()
- Возвращает:
- текущий обработчик
- См. также:
setCorePoolSize
public void setCorePoolSize(int corePoolSize)
- Параметры:
-
corePoolSize— новый размер базового пула - Исключения:
-
IllegalArgumentException— еслиcorePoolSize < 0илиcorePoolSizeпревышает максимальный размер пула - См. также:
getCorePoolSize
public int getCorePoolSize()
- Возвращает:
- базовое количество потоков
- См. также:
prestartCoreThread
public boolean prestartCoreThread()
false, если все базовые потоки уже запущены.- Возвращает:
-
true, если поток был запущен
prestartAllCoreThreads
public int prestartAllCoreThreads()
- Возвращает:
- количество запущенных потоков
allowsCoreThreadTimeOut
public boolean allowsCoreThreadTimeOut()
- Возвращает:
-
true, если базовым потокам разрешено завершаться по тайм-ауту; иначеfalse - Начиная с версии:
- 1.6
allowCoreThreadTimeOut
public void allowCoreThreadTimeOut(boolean value)
true. Как правило, этот метод следует вызывать до начала активного использования пула.- Параметры:
-
value—true, если следует разрешить завершение по тайм-ауту; иначеfalse - Исключения:
-
IllegalArgumentException— если значение равноtrue, а текущее время ожидания завершения не больше нуля - Начиная с версии:
- 1.6
setMaximumPoolSize
public void setMaximumPoolSize(int maximumPoolSize)
- Параметры:
-
maximumPoolSize— новое максимальное значение - Исключения:
-
IllegalArgumentException— если новое максимальное значение меньше или равно нулю либо меньше размера базового пула - См. также:
getMaximumPoolSize
public int getMaximumPoolSize()
- Возвращает:
- максимально допустимое количество потоков
- См. также:
setKeepAliveTime
public void setKeepAliveTime(long time, TimeUnit unit)
- Параметры:
-
time— время ожидания. Нулевое значение времени приведет к немедленному завершению лишних потоков после выполнения задач. -
unit— единица измерения времени для аргументаtime - Исключения:
-
IllegalArgumentException— еслиtimeменьше нуля или еслиtimeравно нулю иallowsCoreThreadTimeOut - См. также:
getKeepAliveTime
public long getKeepAliveTime(TimeUnit unit)
- Параметры:
-
unit— требуемая единица измерения результата - Возвращает:
- ограничение по времени
- См. также:
getQueue
public BlockingQueue<Runnable> getQueue()
- Возвращает:
- очередь задач
remove
public boolean remove(Runnable task)
Этот метод может быть полезен как часть схемы отмены. Он может не удалить задачи, преобразованные в другие формы до помещения во внутреннюю очередь. Например, задача, добавленная с помощью submit, может быть преобразована в форму, сохраняющую состояние Future. Однако в таких случаях для удаления отмененных объектов Future можно использовать метод purge().
- Параметры:
-
task— задача для удаления - Возвращает:
-
true, если задача была удалена
purge
public void purge()
Future. Этот метод может быть полезен для освобождения памяти, не влияя на другие аспекты функциональности. Отмененные задачи никогда не выполняются, но могут накапливаться в очередях задач, пока рабочие потоки не удалят их самостоятельно. Вызов этого метода позволяет попытаться удалить их сразу. Однако при вмешательстве других потоков этот метод может не удалить некоторые задачи.getPoolSize
public int getPoolSize()
- Возвращает:
- количество потоков
getActiveCount
public int getActiveCount()
- Возвращает:
- количество потоков
getLargestPoolSize
public int getLargestPoolSize()
- Возвращает:
- количество потоков
getTaskCount
public long getTaskCount()
- Возвращает:
- количество задач
getCompletedTaskCount
public long getCompletedTaskCount()
- Возвращает:
- количество задач
toString
beforeExecute
protected void beforeExecute(Thread t, Runnable r)
t, который будет выполнять задачу r, и может использоваться для повторной инициализации ThreadLocal или ведения журнала. Эта реализация ничего не делает, но ее можно настроить в подклассах. Примечание. Чтобы корректно выстраивать несколько переопределений в цепочку, подклассам обычно следует вызывать super.beforeExecute в конце этого метода.
- Параметры:
-
t— поток, который будет выполнять задачуr -
r— задача, которая будет выполнена
afterExecute
protected void afterExecute(Runnable r, Throwable t)
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, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html