Класс Thread
- Все реализуемые интерфейсы:
Runnable
- Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Thread определяет конструкторы и Thread.Builder для создания потоков. Запуск потока планирует выполнение его метода run. Запущенный поток выполняется одновременно с потоком, который его запустил.
Поток завершается, если его метод run выполняется нормально либо если его метод run завершается аварийно, а соответствующий обработчик неперехваченных исключений завершается нормально или аварийно. Когда больше нет кода для выполнения, поток завершил работу. Метод isAlive можно использовать, чтобы проверить, завершился ли запущенный поток. Метод join можно использовать для ожидания завершения потока.
У потоков есть уникальный идентификатор и имя. Идентификатор создается при создании Thread и не может быть изменен. Имя потока можно указать при его создании или изменить позднее.
Потоки поддерживают переменные ThreadLocal. Это переменные, локальные для потока: у потока может быть собственная копия переменной со значением, независимым от значений, заданных другими потоками. Thread также поддерживает переменные InheritableThreadLocal — локальные для потока переменные, наследуемые от родительского Thread при создании потока. Thread поддерживает специальную наследуемую локальную переменную потока для загрузчика классов контекста потока.
Платформенные потоки
Thread поддерживает создание платформенных потоков, которые обычно сопоставляются один к одному с потоками ядра, планируемыми операционной системой. Платформенные потоки обычно имеют большой стек и другие ресурсы, которыми управляет операционная система. Платформенные потоки подходят для выполнения задач всех типов, но могут быть ограниченным ресурсом.
По умолчанию платформенные потоки получают автоматически сгенерированное имя.
Платформенные потоки бывают демонными и недемонными. При запуске виртуальной машины Java обычно имеется один недемонный поток (поток, который, как правило, вызывает метод main приложения). Последовательность завершения работы начинается, когда завершаются все запущенные недемонные потоки. Незапущенные недемонные потоки не препятствуют началу последовательности завершения работы.
Помимо статуса демона, у платформенных потоков есть приоритет потока, и они входят в группу потоков.
Виртуальные потоки
Thread также поддерживает создание виртуальных потоков. Виртуальные потоки обычно являются потоками пользовательского режима, планируемыми средой выполнения Java, а не операционной системой. Виртуальным потокам обычно требуется мало ресурсов, и одна виртуальная машина Java может поддерживать миллионы виртуальных потоков. Виртуальные потоки подходят для выполнения задач, в которых большая часть времени проходит в заблокированном состоянии, часто в ожидании завершения операций ввода-вывода. Виртуальные потоки не предназначены для длительных вычислительных операций, интенсивно использующих процессор.
Виртуальные потоки обычно используют небольшой набор платформенных потоков, называемых потоками-носителями. Блокировки и операции ввода-вывода — примеры операций, при которых поток-носитель может быть перепланирован с одного виртуального потока на другой. Код, выполняющийся в виртуальном потоке, не знает о лежащем в его основе потоке-носителе. Метод currentThread(), используемый для получения ссылки на текущий поток, всегда возвращает объект Thread для виртуального потока.
По умолчанию у виртуальных потоков нет имени. Метод getName возвращает пустую строку, если имя потока не задано.
Виртуальные потоки являются демонными и поэтому не препятствуют началу последовательности завершения работы. Приоритет виртуальных потоков фиксирован и не может быть изменен.
Создание и запуск потоков
Thread определяет открытые конструкторы для создания платформенных потоков и метод start для планирования выполнения потоков. Thread можно расширить для настройки и других продвинутых целей, хотя большинству приложений это, скорее всего, не понадобится.
Thread определяет API Thread.Builder для создания и запуска как платформенных, так и виртуальных потоков. Ниже приведены примеры использования построителя:
Runnable runnable = ...
// Start a daemon thread to run a task
Thread thread = Thread.ofPlatform().daemon().start(runnable);
// Create an unstarted thread with name "duke", its start() method
// must be invoked to schedule it to execute.
Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable);
// A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ...
ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory();
// Start a virtual thread to run a task
Thread thread = Thread.ofVirtual().start(runnable);
// A ThreadFactory that creates virtual threads
ThreadFactory factory = Thread.ofVirtual().factory();
Наследование при создании потоков
Thread, созданный одним из открытых конструкторов, наследует статус демона и приоритет потока от родительского потока на момент создания дочернего
Thread. Если группа потоков не указана в конструкторе, она также наследуется. При использовании Thread.Builder для создания платформенного потока статус демона, приоритет потока и группа потоков наследуются, если их не задать в построителе. Как и в случае с конструкторами, наследование от родительского потока происходит при создании дочернего Thread. Thread наследует начальные значения переменных наследуемых локальных переменных потока (включая загрузчик классов контекста) от родительского потока на момент создания дочернего Thread. 5-параметрический конструктор можно использовать для создания потока, который не наследует начальные значения от создающего его потока. При использовании Thread.Builder метод inheritInheritableThreadLocals позволяет выбрать, следует ли наследовать начальные значения.
Прерывание потоков
УThread есть статус прерывания, который служит запросом к выполняемому в потоке коду «остановить или отменить текущую операцию». Статус прерывания устанавливается вызовом метода interrupt() целевого потока. Многие методы, блокирующие поток или переводящие его в ожидание, являются прерываемыми: они обнаруживают установленный статус прерывания потока и досрочно возвращают управление из метода, обычно выбрасывая исключение. Если поток, выполняющий Thread.sleep или Object.wait, прерывается, метод выбрасывает InterruptedException. Методы, выбрасывающие InterruptedException, сначала сбрасывают статус прерывания. Код, перехватывающий InterruptedException, должен повторно выбросить исключение либо восстановить статус прерывания текущего потока с помощью Thread.currentThread().interrupt(), прежде чем продолжить обычное выполнение или обработать исключение, выбросив исключение другого типа. Код, выбрасывающий исключение другого типа, указав InterruptedException в качестве причины или InterruptedException в качестве подавленного исключения, также должен восстановить статус прерывания перед выбрасыванием исключения.
Если прерывается поток, выполняющий блокирующую операцию ввода-вывода в InterruptibleChannel, канал закрывается, а блокирующая операция ввода-вывода выбрасывает ClosedByInterruptException; статус прерывания потока при этом установлен. Если прерывается поток, заблокированный при выполнении операции выбора, операция выбора досрочно возвращает управление, а статус прерывания потока остается установленным.
Код, не вызывающий прерываемые методы, все же может реагировать на прерывание, проверяя статус прерывания текущего потока с помощью Thread.currentThread().isInterrupted().
Помимо методов interrupt() и isInterrupted(), Thread также определяет статический метод Thread.interrupted(), который проверяет статус прерывания текущего потока и сбрасывает его. Обычно в этом методе нет необходимости.
Обработка null
Если не указано иное, передача аргументаnull конструктору или методу этого класса приводит к выбрасыванию NullPointerException.- Примечание по реализации:
- В эталонной реализации JDK планировщик виртуальных потоков можно настроить с помощью следующих системных свойств:
Системное свойство Описание jdk.virtualThreadScheduler.parallelismЦелевой уровень параллелизма планировщика. Это количество платформенных потоков, доступных для планирования виртуальных потоков. По умолчанию оно равно количеству доступных процессоров. jdk.virtualThreadScheduler.maxPoolSizeМаксимальное количество платформенных потоков, доступных планировщику. По умолчанию — 256. Наблюдать за планировщиком виртуальных потоков и управлять им можно с помощью интерфейса управления
jdk.management.VirtualThreadSchedulerMXBean. - Начиная с версии:
- 1.0
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static interface |
Thread.Builder |
Построитель объектов Thread и ThreadFactory. |
static enum |
Thread.State |
Состояние потока. |
static interface |
Thread.UncaughtExceptionHandler |
Интерфейс обработчиков, вызываемых при аварийном завершении Thread из-за неперехваченного исключения. |
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
MAX_PRIORITY |
Максимальный приоритет потока. |
static final int |
MIN_PRIORITY |
Минимальный приоритет потока. |
static final int |
NORM_PRIORITY |
Приоритет потока по умолчанию. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Thread() |
Инициализирует новый платформенный Thread. |
Thread |
Инициализирует новый платформенный Thread. |
Thread |
Инициализирует новый платформенный Thread. |
Thread |
Инициализирует новый платформенный Thread. |
Thread |
Инициализирует новый платформенный Thread. |
Thread |
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, а он сам принадлежал группе потоков, на которую ссылается group. |
Thread |
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, а он сам принадлежал группе потоков, на которую ссылается group, и имел указанный размер стека. |
Thread |
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, он принадлежал группе потоков, на которую ссылается group, имел указанный stackSize и наследовал начальные значения переменных наследуемых локальных переменных потока, если inheritThreadLocals имеет значение true. |
Thread |
Инициализирует новый платформенный Thread. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static int |
activeCount() |
Возвращает оценочное количество активных платформенных потоков в группе потоков текущего потока и ее подгруппах. |
final void |
checkAccess() |
Устарело, планируется удаление: этот элемент API может быть удален в будущей версии. Изначально этот метод определял, есть ли у выполняющегося в данный момент потока разрешение на изменение этого потока. |
protected Object |
clone() |
Выбрасывает CloneNotSupportedException, поскольку объект Thread нельзя осмысленно клонировать. |
static Thread |
currentThread() |
Возвращает объект Thread для текущего потока. |
static void |
dumpStack() |
Выводит трассировку стека текущего потока в стандартный поток ошибок. |
static int |
enumerate |
Копирует в указанный массив все активные платформенные потоки из группы потоков текущего потока и ее подгрупп. |
static Map |
getAllStackTraces() |
Возвращает карту трассировок стека всех активных платформенных потоков. |
ClassLoader |
getContextClassLoader() |
Возвращает контекстный ClassLoader этого потока. |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() |
Возвращает обработчик по умолчанию, вызываемый при аварийном завершении потока из-за неперехваченного исключения. |
long |
getId() |
Устарело. Этот метод не является final и может быть переопределен так, чтобы возвращать значение, отличное от идентификатора потока. |
final String |
getName() |
Возвращает имя этого потока. |
final int |
getPriority() |
Возвращает приоритет этого потока. |
StackTraceElement[] |
getStackTrace() |
Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока. |
Thread.State |
getState() |
Возвращает состояние этого потока. |
final ThreadGroup |
getThreadGroup() |
Возвращает группу потоков этого потока или null, если поток завершился. |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() |
Возвращает обработчик, вызываемый при аварийном завершении этого потока из-за неперехваченного исключения. |
static boolean |
holdsLock |
Возвращает true тогда и только тогда, когда текущий поток удерживает блокировку монитора указанного объекта. |
void |
interrupt() |
Прерывает этот поток. |
static boolean |
interrupted() |
Проверяет, был ли прерван текущий поток. |
final boolean |
isAlive() |
Проверяет, активен ли этот поток. |
final boolean |
isDaemon() |
Проверяет, является ли этот поток потоком-демоном. |
boolean |
isInterrupted() |
Проверяет, был ли прерван этот поток. |
final boolean |
isVirtual() |
Возвращает true, если этот поток является виртуальным. |
final void |
join() |
Ожидает завершения этого потока. |
final void |
join |
Ожидает завершения этого потока не более millis миллисекунд. |
final void |
join |
Ожидает завершения этого потока не более millis миллисекунд и nanos наносекунд. |
final boolean |
join |
Ожидает завершения этого потока в течение заданного времени ожидания. |
static Thread.Builder.OfPlatform |
ofPlatform() |
Возвращает построитель для создания платформенного Thread или ThreadFactory, создающего платформенные потоки. |
static Thread.Builder.OfVirtual |
ofVirtual() |
Возвращает построитель для создания виртуального Thread или ThreadFactory, создающего виртуальные потоки. |
static void |
onSpinWait() |
Сообщает, что вызывающий код временно не может продолжать выполнение до тех пор, пока не произойдут одно или несколько действий со стороны других задач. |
void |
run() |
Этот метод выполняется потоком при его запуске. |
void |
setContextClassLoader |
Устанавливает контекстный ClassLoader этого потока. |
final void |
setDaemon |
Помечает этот поток как демонный или недемонный. |
static void |
setDefaultUncaughtExceptionHandler |
Задает обработчик по умолчанию, вызываемый при аварийном завершении потока из-за неперехваченного исключения, если для этого потока не определен другой обработчик. |
final void |
setName |
Изменяет имя этого потока, задавая ему значение аргумента name. |
final void |
setPriority |
Изменяет приоритет этого потока. |
void |
setUncaughtExceptionHandler |
Задает обработчик, вызываемый при аварийном завершении этого потока из-за неперехваченного исключения. |
static void |
sleep |
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанное количество миллисекунд с учетом точности и аккуратности системных таймеров и планировщиков. |
static void |
sleep |
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанное количество миллисекунд и наносекунд с учетом точности и аккуратности системных таймеров и планировщиков. |
static void |
sleep |
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанный промежуток времени с учетом точности и аккуратности системных таймеров и планировщиков. |
void |
start() |
Планирует запуск этого потока. |
static Thread |
startVirtualThread |
Создает виртуальный поток для выполнения задачи и планирует его выполнение. |
final long |
threadId() |
Возвращает идентификатор этого объекта Thread. |
String |
toString() |
Возвращает строковое представление этого потока. |
static void |
yield() |
Подсказка планировщику о том, что текущий поток готов уступить текущее использование процессора. |
Методы, объявленные в классе Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
equals |
Указывает, является ли другой объект «равным» этому объекту. |
protected void |
finalize() |
Устарело, планируется удаление: этот элемент API может быть удален в будущей версии. Финализация устарела и подлежит удалению в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание полей
MIN_PRIORITY
public static final int MIN_PRIORITY
- См. также:
NORM_PRIORITY
public static final int NORM_PRIORITY
- См. также:
MAX_PRIORITY
public static final int MAX_PRIORITY
- См. также:
Подробное описание конструкторов
Thread
public Thread()
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, null, gname), где gname — сгенерированное новое имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число. Этот конструктор полезен только при расширении Thread для переопределения метода run().
- См. также:
Thread
public Thread(Runnable task)
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, task, gname), где gname — сгенерированное новое имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число. Если задача не равна null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform().unstarted(task);
- Параметры:
-
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, методrunэтого класса ничего не делает. - См. также:
Thread
public Thread(ThreadGroup group, Runnable task)
Thread. Этот конструктор имеет тот же эффект, что и Thread (group, task, gname), где gname — сгенерированное новое имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число. Если группа и задача не равны null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform().group(group).unstarted(task);
- Параметры:
-
group— группа потоков. Еслиnull, в качестве группы задается группа потоков текущего потока. -
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. - См. также:
Thread
Thread
public Thread(ThreadGroup group, String name)
Thread. Этот конструктор имеет тот же эффект, что и Thread (group, null, name). Этот конструктор полезен только при расширении Thread для переопределения метода run().
- Параметры:
-
group— группа потоков. Еслиnull, в качестве группы задается группа потоков текущего потока. -
name— имя нового потока - См. также:
Thread
public Thread(Runnable task, String name)
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, task, name). Если задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform().name(name).unstarted(task);
- Параметры:
-
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name— имя нового потока - См. также:
Thread
public Thread(ThreadGroup group, Runnable task, String name)
Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени и принадлежал группе потоков, на которую ссылается group. Приоритет вновь созданного потока равен меньшему из приоритета создающего его потока и максимально допустимого приоритета группы потоков. Для изменения приоритета можно использовать метод setPriority.
Вновь созданный поток изначально помечается как поток-демон тогда и только тогда, когда создающий его поток в данный момент помечен как поток-демон. Чтобы изменить статус потока-демона, можно использовать метод setDaemon.
Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform().group(group).name(name).unstarted(task);
- Параметры:
-
group— группа потоков. Еслиnull, в качестве группы задается группа потоков текущего потока. -
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name— имя нового потока - См. также:
Thread
public Thread(ThreadGroup group, Runnable task, String name, long stackSize)
Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени, принадлежал группе потоков, на которую ссылается group, и имел указанный размер стека. Этот конструктор идентичен Thread(ThreadGroup,Runnable,String), за исключением того, что он позволяет указать размер стека потока. Размер стека — это приблизительное количество байтов адресного пространства, выделяемого виртуальной машиной для стека этого потока. Действие параметра stackSize, если таковое имеется, в значительной степени зависит от платформы.
На некоторых платформах указание большего значения параметра stackSize может позволить потоку достичь большей глубины рекурсии до возникновения исключения StackOverflowError. Аналогично, указание меньшего значения может позволить большему числу потоков существовать одновременно без возникновения исключения OutOfMemoryError (или другой внутренней ошибки). Зависимость между значением параметра stackSize и максимальной глубиной рекурсии и уровнем параллелизма определяется платформой. На некоторых платформах значение параметра stackSize может вообще не оказывать никакого влияния.
Виртуальная машина может рассматривать параметр stackSize как рекомендацию. Если указанное значение слишком мало для данной платформы, виртуальная машина может использовать вместо него некоторое минимальное значение, специфичное для платформы; если указанное значение слишком велико, виртуальная машина может использовать вместо него некоторое максимальное значение, специфичное для платформы. Аналогично, виртуальная машина может округлить указанное значение в большую или меньшую сторону по своему усмотрению (или полностью проигнорировать его).
Указание значения ноль для параметра stackSize приведет к тому, что этот конструктор будет вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String).
Учитывая зависимый от платформы характер поведения этого конструктора, при его использовании следует проявлять особую осторожность. Размер стека потока, необходимый для выполнения определенного вычисления, вероятно, будет различаться в разных реализациях JRE. С учетом этого различия может потребоваться тщательная настройка параметра размера стека, а также повторная настройка для каждой реализации JRE, в которой должно выполняться приложение.
Примечание по реализации: разработчикам платформы Java рекомендуется документировать поведение своей реализации относительно параметра stackSize.
Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform().group(group).name(name).stackSize(stackSize).unstarted(task);
- Параметры:
-
group— группа потоков. Еслиnull, в качестве группы задается группа потоков текущего потока. -
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name— имя нового потока -
stackSize— желаемый размер стека нового потока или ноль, если этот параметр следует игнорировать. - С версии:
- 1.4
- См. также:
Thread
public Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени, принадлежал группе потоков, на которую ссылается group, имел указанный stackSize и наследовал начальные значения переменных наследуемых локальных переменных потока, если inheritThreadLocals равно true. Этот конструктор идентичен Thread(ThreadGroup,Runnable,String,long), но дополнительно позволяет запретить или разрешить наследование начальных значений наследуемых локальных переменных потока от создающего потока. Это обеспечивает более точный контроль над наследуемыми локальными переменными потока. При передаче значения false для inheritThreadLocals следует соблюдать осторожность, так как это может привести к неожиданному поведению, если новый поток выполняет код, ожидающий наследования определенного значения локальной переменной потока.
Указание значения true для параметра inheritThreadLocals приведет к тому, что этот конструктор будет вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String, long).
Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:
Thread.ofPlatform()
.group(group)
.name(name)
.stackSize(stackSize)
.inheritInheritableThreadLocals(inheritInheritableThreadLocals)
.unstarted(task);
- Параметры:
-
group— группа потоков. Еслиnull, в качестве группы задается группа потоков текущего потока. -
task— объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name— имя нового потока -
stackSize— желаемый размер стека нового потока или ноль, если этот параметр следует игнорировать -
inheritInheritableThreadLocals— еслиtrue, наследовать начальные значения наследуемых локальных переменных потока от создающего потока; в противном случае начальные значения не наследуются - С версии:
- 9
- См. также:
Подробное описание методов
currentThread
public static Thread currentThread()
- Возвращает:
- текущий поток
yield
public static void yield()
Вызов yield — это эвристическая попытка улучшить относительный прогресс потоков, которые в противном случае чрезмерно загружали бы ЦП. Его использование следует сочетать с подробным профилированием и тестированием производительности, чтобы убедиться, что он действительно дает желаемый эффект.
Использовать этот метод обычно нецелесообразно. Он может быть полезен при отладке или тестировании, когда помогает воспроизвести ошибки, вызванные состояниями гонки. Он также может оказаться полезным при разработке конструкций управления параллелизмом, таких как конструкции из пакета java.util.concurrent.locks.
sleep
public static void sleep(long millis) throws InterruptedException
- Параметры:
-
millis— продолжительность приостановки в миллисекундах - Выбрасывает:
-
IllegalArgumentException— если значениеmillisотрицательно -
InterruptedException— если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
sleep
public static void sleep(long millis, int nanos) throws InterruptedException
- Параметры:
-
millis— продолжительность приостановки в миллисекундах -
nanos— дополнительные наносекунды приостановки0-999999 - Выбрасывает:
-
IllegalArgumentException— если значениеmillisотрицательно или значениеnanosне входит в диапазон0-999999 -
InterruptedException— если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
sleep
public static void sleep(Duration duration) throws InterruptedException
- Параметры:
-
duration— продолжительность приостановки - Выбрасывает:
-
InterruptedException— если текущий поток прерван во время приостановки. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается. - С версии:
- 19
onSpinWait
public static void onSpinWait()
- Примечание API:
- Например, рассмотрим метод класса, который выполняет цикл, пока не будет установлен флаг, изменяемый вне этого метода. Внутри цикла активного ожидания следует разместить вызов метода
onSpinWait.class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . } }Приведенный выше код останется корректным, даже если метод
onSpinWaitвообще не вызывать. Однако на некоторых архитектурах виртуальная машина Java может выдавать инструкции процессору, позволяющие эффективнее обрабатывать такие шаблоны кода. - С версии:
- 9
ofPlatform
public static Thread.Builder.OfPlatform ofPlatform()
Thread или ThreadFactory, создающего платформенные потоки.- Примечание API:
- Ниже приведены примеры использования построителя:
// Start a daemon thread to run a task Thread thread = Thread.ofPlatform().daemon().start(runnable); // Create an unstarted thread with name "duke", its start() method // must be invoked to schedule it to execute. Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable); // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ... ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory(); - Возвращает:
- Построитель для создания объектов
ThreadилиThreadFactory. - С версии:
- 21
ofVirtual
public static Thread.Builder.OfVirtual ofVirtual()
Thread или ThreadFactory, создающего виртуальные потоки.- Примечание API:
- Ниже приведены примеры использования построителя:
// Start a virtual thread to run a task. Thread thread = Thread.ofVirtual().start(runnable); // A ThreadFactory that creates virtual threads ThreadFactory factory = Thread.ofVirtual().factory(); - Возвращает:
- Построитель для создания объектов
ThreadилиThreadFactory. - С версии:
- 21
clone
protected Object clone() throws CloneNotSupportedException
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клон этого экземпляра.
- Выбрасывает:
-
CloneNotSupportedException— всегда - См. также:
startVirtualThread
public static Thread startVirtualThread(Runnable task)
Этот метод эквивалентен следующему:
Thread.ofVirtual().start(task);
- Параметры:
-
task— объект, который будет выполнен потоком - Возвращает:
- новый запущенный виртуальный поток
- С версии:
- 21
- См. также:
isVirtual
public final boolean isVirtual()
true, если этот поток является виртуальным. Виртуальный поток планируется виртуальной машиной Java, а не операционной системой.- Возвращает:
-
true, если этот поток является виртуальным - С версии:
- 21
start
public void start()
Поток можно запустить не более одного раза. В частности, его нельзя запустить повторно после завершения.
- Выбрасывает:
-
IllegalThreadStateException— если поток уже был запущен
run
public void run()
Thread могут переопределять этот метод. Этот метод не предназначен для прямого вызова. Если этот поток является платформенным потоком, созданным с задачей Runnable, то вызов этого метода вызовет метод run задачи. Если этот поток является виртуальным, прямой вызов этого метода ничего не делает.
interrupt
public void interrupt()
Если этот поток заблокирован при вызове методов wait(), wait(long) или wait(long, int) класса Object либо методов join(), join(long), join(long, int), sleep(long) или sleep(long, int) этого класса, его статус прерывания будет сброшен, и он получит исключение InterruptedException.
Если этот поток заблокирован в операции ввода-вывода через InterruptibleChannel, канал будет закрыт, статус прерывания потока будет установлен, и поток получит исключение ClosedByInterruptException.
Если этот поток заблокирован в Selector, статус прерывания потока будет установлен, и поток немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод wakeup селектора.
Если ни одно из предыдущих условий не выполняется, статус прерывания этого потока будет установлен.
Прерывание неактивного потока не обязательно должно иметь какой-либо эффект.
- Примечание по реализации:
- В эталонной реализации JDK прерывание неактивного потока все равно сохраняет факт получения запроса на прерывание; его можно проверить с помощью методов
interrupted()иisInterrupted(). - См. также:
interrupted
public static boolean interrupted()
- Примечание API:
- Этот метод редко требуется использовать напрямую. Он предназначен для случаев, когда обнаруживается прерывание потока и статус прерывания сбрасывается перед выбрасыванием исключения
InterruptedException. Он также может быть полезен при реализации непрерываемого метода, использующего прерываемый метод, напримерLockSupport.park(). Методinterrupted()можно использовать для проверки наличия прерывания и сброса статуса прерывания, чтобы код мог повторить вызов прерываемого метода. Перед завершением непрерываемый метод должен восстановить статус прерывания. - Возвращает:
-
true, если текущий поток был прерван; в противном случае —false. - См. также:
isInterrupted
public boolean isInterrupted()
- Возвращает:
-
true, если этот поток был прерван; в противном случае —false. - См. также:
isAlive
public final boolean isAlive()
- Возвращает:
-
true, если этот поток активен; в противном случае —false.
setPriority
public final void setPriority(int newPriority)
newPriority и максимально допустимого приоритета группы потоков. Приоритет виртуального потока всегда равен NORM_PRIORITY, а newPriority игнорируется.- Параметры:
-
newPriority— новый приоритет потока - Выбрасывает:
-
IllegalArgumentException— если приоритет не входит в диапазон отMIN_PRIORITYдоMAX_PRIORITY. - См. также:
getPriority
public final int getPriority()
Приоритет виртуального потока всегда равен NORM_PRIORITY.
- Возвращает:
- приоритет этого потока.
- См. также:
setName
public final void setName(String name)
name.- Примечание по реализации:
- В эталонной реализации JDK, если этот поток является текущим потоком и представляет собой платформенный поток, который не был присоединён к виртуальной машине с помощью функции Java Native Interface AttachCurrentThread, этот метод задаёт имя потока операционной системы. Это может быть полезно для отладки и устранения неполадок.
- Параметры:
-
name— новое имя этого потока. - Внешние спецификации
- См. также:
getName
public final String getName()
- Возвращает:
- имя этого потока.
- См. также:
getThreadGroup
public final ThreadGroup getThreadGroup()
null, если поток завершил работу. Для виртуального потока возвращается специальная группа ThreadGroup для виртуальных потоков.
- Возвращает:
- группу потоков этого потока или
null
activeCount
public static int activeCount()
Возвращаемое значение является лишь оценкой, поскольку количество потоков может динамически изменяться во время обхода этим методом внутренних структур данных, а также может зависеть от наличия определённых системных потоков. Этот метод предназначен главным образом для отладки и мониторинга.
- Возвращает:
- оценочное количество работающих платформенных потоков в группе потоков текущего потока и в любой другой группе потоков, для которой группа потоков текущего потока является родительской
enumerate
public static int enumerate(Thread[] tarray)
ThreadGroup.enumerate(Thread[]) группы потоков текущего потока. Виртуальные потоки этим методом не перечисляются. Приложение может использовать метод activeCount, чтобы оценить необходимый размер массива, однако если массив слишком мал для размещения всех потоков, лишние потоки будут молча проигнорированы. Если необходимо получить каждый работающий поток из группы потоков текущего потока и её подгрупп, вызывающий код должен проверить, что возвращённое значение типа int строго меньше длины tarray.
Из-за неизбежной гонки данных в этом методе рекомендуется использовать его только для отладки и мониторинга.
- Параметры:
-
tarray— массив, в который следует поместить список потоков - Возвращает:
- количество потоков, помещённых в массив
join
public final void join(long millis) throws InterruptedException
millis миллисекунд. Значение тайм-аута 0 означает ожидание без ограничения времени. Этот метод возвращает управление немедленно, не ожидая, если поток ещё не был started.- Примечание по реализации:
- В этой реализации используется цикл вызовов
this.waitс условиемthis.isAlive. При завершении потока вызывается методthis.notifyAll. Рекомендуется не использовать в приложенияхwait,notifyилиnotifyAllдля экземпляровThread. - Параметры:
-
millis— время ожидания в миллисекундах - Выбрасывает:
-
IllegalArgumentException— если значениеmillisотрицательно -
InterruptedException— если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
join
public final void join(long millis, int nanos) throws InterruptedException
millis миллисекунд плюс nanos наносекунд. Если оба аргумента равны 0, это означает ожидание без ограничения времени. Этот метод возвращает управление немедленно, не ожидая, если поток ещё не был started.- Примечание по реализации:
- В этой реализации используется цикл вызовов
this.waitс условиемthis.isAlive. При завершении потока вызывается методthis.notifyAll. Рекомендуется не использовать в приложенияхwait,notifyилиnotifyAllдля экземпляровThread. - Параметры:
-
millis— время ожидания в миллисекундах -
nanos—0-999999дополнительные наносекунды ожидания - Выбрасывает:
-
IllegalArgumentException— если значениеmillisотрицательно или значениеnanosне входит в диапазон0-999999 -
InterruptedException— если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
join
public final void join() throws InterruptedException
Вызов этого метода ведёт себя точно так же, как вызов
join(0)
- Выбрасывает:
-
InterruptedException— если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
join
public final boolean join(Duration duration) throws InterruptedException
Этот метод не ожидает, если время ожидания меньше или равно нулю. В этом случае метод лишь проверяет, завершил ли поток работу.
- Параметры:
-
duration— максимальное время ожидания - Возвращает:
-
true, если поток завершил работу,false, если поток не завершил работу - Выбрасывает:
-
InterruptedException— если текущий поток прерван во время ожидания. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается. -
IllegalThreadStateException— если этот поток не был запущен. - Начиная с:
- 19
dumpStack
public static void dumpStack()
setDaemon
public final void setDaemon(boolean on)
Статус виртуального потока как потока-демона всегда равен true; этот метод не может изменить его на false.
Этот метод необходимо вызвать до запуска потока. Поведение этого метода после завершения потока не определено.
- Параметры:
-
on— еслиtrue, помечает этот поток как поток-демон - Выбрасывает:
-
IllegalArgumentException— если это виртуальный поток иonравно false -
IllegalThreadStateException— если этот поток работает
isDaemon
public final boolean isDaemon()
true.- Возвращает:
-
true, если этот поток является потоком-демоном; в противном случае —false. - См. также:
checkAccess
@Deprecated(since="17", forRemoval=true) public final void checkAccess()
toString
public String toString()
getContextClassLoader
public ClassLoader getContextClassLoader()
ClassLoader этого потока. Контекстный ClassLoader может быть задан создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов. Если он не задан, по умолчанию наследуется загрузчик классов контекста родительского потока. Контекстный ClassLoader начального потока обычно задаётся как загрузчик классов, использованный для загрузки приложения.
- Возвращает:
- контекстный
ClassLoaderэтого потока илиnull, обозначающий системный загрузчик классов (или, если он недоступен, загрузчик классов начальной загрузки) - Начиная с:
- 1.2
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
ClassLoader этого потока. Контекстный ClassLoader может быть задан создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов.
- Параметры:
-
cl— контекстный загрузчик классов этого потока или null, обозначающий системный загрузчик классов (или, если он недоступен, загрузчик классов начальной загрузки) - Начиная с:
- 1.2
holdsLock
public static boolean holdsLock(Object obj)
true тогда и только тогда, когда текущий поток удерживает мониторную блокировку указанного объекта. Этот метод предназначен для того, чтобы программа могла утверждать, что текущий поток уже удерживает указанную блокировку:
assert Thread.holdsLock(obj);
- Параметры:
-
obj— объект, для которого проверяется владение блокировкой - Возвращает:
-
true, если текущий поток удерживает мониторную блокировку указанного объекта. - Начиная с:
- 1.4
getStackTrace
public StackTraceElement[] getStackTrace()
В некоторых обстоятельствах виртуальные машины могут опускать из трассировки стека один или несколько кадров. В крайнем случае виртуальная машина, не располагающая сведениями о трассировке стека этого потока, может вернуть из этого метода массив нулевой длины.
- Возвращает:
- массив
StackTraceElement, каждый элемент которого представляет один кадр стека. - Начиная с:
- 1.5
- См. также:
getAllStackTraces
public static Map<Thread, StackTraceElement[]> getAllStackTraces()
StackTraceElement, содержащий дамп стека соответствующего Thread. Возвращаемые трассировки стека имеют формат, указанный для метода getStackTrace. Во время вызова этого метода потоки могут продолжать выполнение. Трассировка стека каждого потока представляет собой лишь снимок, причём снимки разных трассировок могут быть получены в разное время. Если виртуальная машина не располагает сведениями о трассировке стека потока, в значении карты будет возвращён массив нулевой длины.
- Возвращает:
Map, сопоставляющуюThreadмассивStackTraceElement, представляющий трассировку стека соответствующего потока.- Начиная с:
- 1.5
- См. также:
getId
@Deprecated(since="19") public long getId()
threadId().long, генерируемое при создании потока. Идентификатор потока уникален и не изменяется в течение всего времени его существования.- Возвращает:
- идентификатор этого потока
- Начиная с:
- 1.5
threadId
public final long threadId()
long, генерируемое при создании потока. Идентификатор потока уникален и не изменяется в течение всего времени его существования.- Возвращает:
- идентификатор этого потока
- Начиная с:
- 19
getState
public Thread.State getState()
- Возвращает:
- состояние этого потока.
- Начиная с:
- 1.5
setDefaultUncaughtExceptionHandler
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Обработка неперехваченных исключений сначала контролируется самим потоком, затем объектом ThreadGroup потока и, наконец, обработчиком неперехваченных исключений по умолчанию. Если для потока явно не задан обработчик неперехваченных исключений, а группа потоков этого потока (включая родительские группы потоков) не переопределяет метод uncaughtException, будет вызван метод uncaughtException обработчика по умолчанию.
Задав обработчик неперехваченных исключений по умолчанию, приложение может изменить способ обработки неперехваченных исключений (например, настроить их запись на определённое устройство или в файл) для потоков, которые в противном случае использовали бы системное поведение «по умолчанию».
Обратите внимание: обработчик неперехваченных исключений по умолчанию обычно не должен передавать обработку объекту ThreadGroup потока, поскольку это может привести к бесконечной рекурсии.
- Параметры:
-
ueh— объект, используемый в качестве обработчика неперехваченных исключений по умолчанию. Если значение равноnull, обработчик по умолчанию отсутствует. - Начиная с:
- 1.5
- См. также:
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
null, обработчик по умолчанию отсутствует.- Возвращает:
- обработчик неперехваченных исключений по умолчанию для всех потоков
- Начиная с:
- 1.5
- См. также:
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
ThreadGroup этого потока, если только поток не завершил работу; в последнем случае возвращается null.- Возвращает:
- обработчик неперехваченных исключений этого потока
- Начиная с:
- 1.5
setUncaughtExceptionHandler
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Поток может полностью контролировать реакцию на неперехваченные исключения, если для него явно задан обработчик неперехваченных исключений. Если такой обработчик не задан, его роль выполняет объект ThreadGroup этого потока.
- Параметры:
-
ueh— объект, используемый в качестве обработчика неперехваченных исключений этого потока. Если значение равноnull, у потока нет явного обработчика. - Начиная с:
- 1.5
- См. также:
© 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.