Spec-Zone.ru › OpenJDK 25

Класс Thread

java.lang.Object
java.lang.Thread
Все реализуемые интерфейсы:
Runnable
Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Поток — это поток выполнения в программе. Виртуальная машина Java позволяет приложению одновременно выполнять несколько потоков.

Thread определяет конструкторы и Thread.Builder для создания потоков. Запуск потока планирует выполнение его метода run. Новый запущенный поток выполняется одновременно с потоком, который инициировал его запуск.

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

У потоков есть уникальный идентификатор и имя. Идентификатор генерируется при создании Thread и не может быть изменен. Имя потока можно указать при его создании или изменить позднее.

Потоки поддерживают переменные ThreadLocal. Это переменные, локальные для потока: у потока может быть собственная копия переменной со значением, не зависящим от значений, заданных другими потоками. Thread также поддерживает переменные InheritableThreadLocal — локальные для потока переменные, наследуемые при создании потока от родительского Thread. Thread поддерживает специальную наследуемую локальную переменную потока для загрузчика классов контекста потока.

Платформенные потоки

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

По умолчанию платформенным потокам автоматически присваивается имя.

Платформенные потоки бывают демон-потоками и потоками, не являющимися демонами. При запуске виртуальной машины 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 позволяет выбрать, будут ли наследоваться начальные значения.

Если не указано иное, передача аргумента null конструктору или методу этого класса приводит к выбрасыванию исключения NullPointerException.

Примечание по реализации:
В эталонной реализации JDK планировщик виртуальных потоков можно настроить с помощью следующих системных свойств:
Системные свойства
Системное свойство Описание
jdk.virtualThreadScheduler.parallelism Количество платформенных потоков, доступных для планирования виртуальных потоков. По умолчанию равно количеству доступных процессоров.
jdk.virtualThreadScheduler.maxPoolSize Максимальное количество платформенных потоков, доступных планировщику. По умолчанию — 256.
Начиная с версии:
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(Runnable task)
Инициализирует новый платформенный Thread.
Thread(Runnable task, String name)
Инициализирует новый платформенный Thread.
Thread(String name)
Инициализирует новый платформенный Thread.
Thread(ThreadGroup group, Runnable task)
Инициализирует новый платформенный Thread.
Thread(ThreadGroup group, Runnable task, String name)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем было указанное name, а он принадлежал группе потоков, на которую ссылается group.
Thread(ThreadGroup group, Runnable task, String name, long stackSize)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем было указанное name, он принадлежал группе потоков, на которую ссылается group, и имел указанный размер стека.
Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем было указанное name, он принадлежал группе потоков, на которую ссылается group, имел указанный stackSize и наследовал начальные значения наследуемых локальных переменных потока, если inheritThreadLocals равен true.
Thread(ThreadGroup group, String name)
Инициализирует новый платформенный Thread.

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

Модификатор и тип Метод Описание
static int activeCount()
Возвращает оценочное количество активных платформенных потоков в группе потоков текущего потока и ее подгруппах.
final void checkAccess()
Устарело, подлежит удалению: этот элемент API может быть удален в будущей версии.
Изначально этот метод определял, имел ли выполняющийся в данный момент поток разрешение на изменение этого потока.
protected Object clone()
Выбрасывает CloneNotSupportedException, поскольку объект Thread нельзя осмысленно клонировать.
static Thread currentThread()
Возвращает объект Thread для текущего потока.
static void dumpStack()
Выводит трассировку стека текущего потока в стандартный поток ошибок.
static int enumerate(Thread[] tarray)
Копирует в указанный массив все активные платформенные потоки из группы потоков текущего потока и ее подгрупп.
static Map<Thread, StackTraceElement[]> 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(Object obj)
Возвращает true тогда и только тогда, когда текущий поток удерживает блокировку монитора указанного объекта.
void interrupt()
Прерывает этот поток.
static boolean interrupted()
Проверяет, был ли прерван текущий поток.
final boolean isAlive()
Проверяет, активен ли этот поток.
final boolean isDaemon()
Проверяет, является ли этот поток потоком-демоном.
boolean isInterrupted()
Проверяет, был ли прерван этот поток.
final boolean isVirtual()
Возвращает true, если этот поток является виртуальным.
final void join()
Ожидает завершения этого потока.
final void join(long millis)
Ожидает завершения этого потока не более millis миллисекунд.
final void join(long millis, int nanos)
Ожидает завершения этого потока не более millis миллисекунд и nanos наносекунд.
final boolean join(Duration duration)
Ожидает завершения этого потока в течение указанного времени ожидания.
static Thread.Builder.OfPlatform ofPlatform()
Возвращает построитель для создания платформенного Thread или ThreadFactory, создающего платформенные потоки.
static Thread.Builder.OfVirtual ofVirtual()
Возвращает построитель для создания виртуального Thread или ThreadFactory, создающего виртуальные потоки.
static void onSpinWait()
Указывает, что вызывающий код временно не может продолжать выполнение до тех пор, пока не произойдет одно или несколько действий со стороны других процессов.
void run()
Этот метод выполняется потоком при его запуске.
void setContextClassLoader(ClassLoader cl)
Устанавливает контекстный ClassLoader для этого потока.
final void setDaemon(boolean on)
Помечает этот поток как поток-демон или поток, не являющийся демоном.
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задает обработчик по умолчанию, вызываемый при аварийном завершении потока из-за неперехваченного исключения, если для этого потока не задан другой обработчик.
final void setName(String name)
Изменяет имя этого потока, присваивая ему значение аргумента name.
final void setPriority(int newPriority)
Изменяет приоритет этого потока.
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задает обработчик, вызываемый при аварийном завершении этого потока из-за неперехваченного исключения.
static void sleep(long millis)
Усыпляет выполняющийся в данный момент поток (временно приостанавливает его выполнение) на указанное количество миллисекунд с учетом точности и аккуратности системных таймеров и планировщиков.
static void sleep(long millis, int nanos)
Усыпляет выполняющийся в данный момент поток (временно приостанавливает его выполнение) на указанное количество миллисекунд и наносекунд с учетом точности и аккуратности системных таймеров и планировщиков.
static void sleep(Duration duration)
Усыпляет выполняющийся в данный момент поток (временно приостанавливает его выполнение) на указанный промежуток времени с учетом точности и аккуратности системных таймеров и планировщиков.
void start()
Планирует запуск этого потока.
static Thread startVirtualThread(Runnable task)
Создает виртуальный поток для выполнения задачи и планирует его выполнение.
final void stop()
Устарело, подлежит удалению: этот элемент API может быть удален в будущей версии.
Изначально этот метод был предназначен для «остановки» целевого потока путем вызова в нем исключения ThreadDeath.
final long threadId()
Возвращает идентификатор этого Thread.
String toString()
Возвращает строковое представление этого потока.
static void yield()
Подсказка планировщику о том, что текущий поток готов уступить процессор, которым он сейчас пользуется.

Методы, объявленные в классе Object

equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, 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

public Thread(String name)
Инициализирует новый платформенный Thread. Этот конструктор действует так же, как Thread (null, null, name).

Этот конструктор полезен только при наследовании от Thread для переопределения метода run().

Параметры:
name — имя нового потока
См. также:
  • Наследование при создании потоков

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 и наследовал начальные значения переменных InheritableThreadLocal, если inheritThreadLocals равно true.

Этот конструктор идентичен Thread(ThreadGroup,Runnable,String,long), но дополнительно позволяет включить или отключить наследование начальных значений переменных InheritableThreadLocal от создающего потока. Это обеспечивает более точный контроль над переменными InheritableThreadLocal. При передаче значения false для inheritThreadLocals следует соблюдать осторожность: это может привести к непредвиденному поведению, если новый поток выполняет код, предполагающий наследование определенного значения переменной ThreadLocal.

Если для параметра inheritThreadLocals указать значение true, этот конструктор будет вести себя точно так же, как конструктор 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, наследовать начальные значения переменных InheritableThreadLocal от создающего потока; в противном случае начальные значения не наследуются
Начиная с:
9
См. также:
  • Наследование при создании потоков

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

currentThread

public static Thread currentThread()
Возвращает объект Thread для текущего потока.
Возвращает:
текущий поток

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
Выбрасывает CloneNotSupportedException, поскольку Thread нельзя осмысленно клонировать. Вместо этого создайте новый Thread.
Переопределяет:
clone в классе Object
Возвращает:
клон этого экземпляра.
Выбрасывает:
CloneNotSupportedException — всегда
См. также:
  • Cloneable

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 задачи. Если этот поток является виртуальным, непосредственный вызов этого метода ничего не делает.

Определен в:
run в интерфейсе Runnable
Требования к реализации:
Реализация по умолчанию выполняет задачу Runnable, с которой был создан Thread. Если поток создан без задачи, этот метод ничего не делает.

stop

@Deprecated(since="1.2", forRemoval=true) public final void stop()
Устарел, планируется удаление: этот элемент API будет удален в будущей версии.
Изначально этот метод был предназначен для «остановки» потока-жертвы путем выброса в нем исключения ThreadDeath. Такой способ по своей природе небезопасен. Остановка потока приводила к снятию всех блокировок с мониторов, которыми он владел (как естественное следствие распространения исключения ThreadDeath вверх по стеку). Если какие-либо объекты, ранее защищенные этими мониторами, находились в несогласованном состоянии, поврежденные объекты становились видны другим потокам, что могло привести к произвольному поведению. Вместо использования stop следует применять код, который просто изменяет переменную, указывающую, что целевому потоку нужно остановиться. Целевой поток должен регулярно проверять эту переменную и корректно выходить из своего метода run, если переменная указывает на необходимость остановки. Если целевой поток надолго блокируется (например, ожидая на условной переменной), для прерывания ожидания следует использовать метод interrupt. Дополнительную информацию см. в разделе Почему Thread.stop объявлен устаревшим и возможность остановки потока удалена?.
Выбрасывает UnsupportedOperationException.
Выбрасывает:
UnsupportedOperationException — всегда

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()
Проверяет, был ли прерван текущий поток. Этот метод сбрасывает статус прерывания потока. Иными словами, если вызвать этот метод два раза подряд, второй вызов вернет false (если только текущий поток не будет прерван снова после того, как первый вызов сбросит его статус прерывания, но до того, как второй вызов проверит этот статус).
Возвращает:
true, если текущий поток был прерван; в противном случае — false.
См. также:
  • isInterrupted()

isInterrupted

public boolean isInterrupted()
Проверяет, был ли прерван этот поток. Этот метод не изменяет статус прерывания потока.
Возвращает:
true, если этот поток был прерван; в противном случае — false.
См. также:
  • interrupted()

isAlive

public final boolean isAlive()
Проверяет, активен ли этот поток. Поток активен, если он был запущен и еще не завершился.
Возвращает:
true, если этот поток активен; в противном случае — false.

setPriority

public final void setPriority(int newPriority)
Изменяет приоритет этого потока. Для платформенных потоков приоритет устанавливается равным меньшему из указанного newPriority и максимально допустимого приоритета группы потоков thread group. Приоритет виртуального потока всегда равен NORM_PRIORITY, а newPriority игнорируется.
Параметры:
newPriority — новый приоритет потока
Исключения:
IllegalArgumentException — если приоритет не входит в диапазон от MIN_PRIORITY до MAX_PRIORITY.
См. также:
  • setPriority(int)
  • ThreadGroup.getMaxPriority()

getPriority

public final int getPriority()
Возвращает приоритет этого потока.

Приоритет виртуального потока всегда равен NORM_PRIORITY.

Возвращает:
приоритет этого потока.
См. также:
  • setPriority(int)

setName

public final void setName(String name)
Изменяет имя этого потока, устанавливая его равным аргументу name.
Примечание по реализации:
В эталонной реализации JDK, если этот поток является текущим и представляет собой платформенный поток, подключенный к виртуальной машине не с помощью функции AttachCurrentThread интерфейса Java Native Interface, этот метод задает имя потока операционной системы. Это может быть полезно для отладки и поиска неисправностей.
Параметры:
name — новое имя этого потока.
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • getName()

getName

public final String getName()
Возвращает имя этого потока.
Возвращает:
имя этого потока.
См. также:
  • setName(String)

getThreadGroup

public final ThreadGroup getThreadGroup()
Возвращает группу потоков этого потока или null, если поток завершился.

Для виртуального потока возвращается специальная группа потоков для виртуальных потоков.

Возвращает:
группу потоков этого потока или 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.
См. также:
  • setDaemon(boolean)

checkAccess

@Deprecated(since="17", forRemoval=true) public final void checkAccess()
Устарело, планируется удаление: этот элемент API может быть удален в будущей версии.
Изначально этот метод определял, имел ли выполняющийся в данный момент поток разрешение на изменение этого потока. Метод был полезен только в сочетании с менеджером безопасности, поддержка которого прекращена. Замены менеджеру безопасности или этому методу нет.
Ничего не делает.

toString

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

getContextClassLoader

public ClassLoader getContextClassLoader()
Возвращает контекстный ClassLoader этого потока. Контекстный ClassLoader может быть задан создателем потока для использования выполняющимся в этом потоке кодом при загрузке классов и ресурсов. Если он не задан, по умолчанию наследуется загрузчик классов контекста родительского потока.

Контекстный ClassLoader исходного потока обычно устанавливается в загрузчик классов, использованный для загрузки приложения.

Возвращает:
контекстный ClassLoader этого потока или null, указывающий на системный загрузчик классов (или, если он недоступен, на загрузчик классов начальной загрузки)
Начиная с версии:
1.2

setContextClassLoader

public void setContextClassLoader(ClassLoader cl)
Задает контекстный ClassLoader для этого потока.

Контекстный ClassLoader может быть задан создателем потока для использования выполняющимся в этом потоке кодом при загрузке классов и ресурсов.

Параметры:
cl — контекстный ClassLoader для этого Thread или 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
См. также:
  • Throwable.getStackTrace()

getAllStackTraces

public static Map<Thread, StackTraceElement[]> getAllStackTraces()
Возвращает карту трассировок стека всех активных платформенных потоков. Карта не включает виртуальные потоки. Ключами карты являются потоки, а каждое значение карты — массив StackTraceElement, представляющий дамп стека соответствующего Thread. Возвращаемые трассировки стека имеют формат, указанный для метода getStackTrace.

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

Возвращает:
Map, сопоставляющую Thread массиву StackTraceElement, представляющему трассировку стека соответствующего потока.
Начиная с версии:
1.5
См. также:
  • getStackTrace()
  • Throwable.getStackTrace()

getId

@Deprecated(since="19") public long getId()
Устарело.
Этот метод не является final и может быть переопределен так, чтобы возвращать значение, не являющееся идентификатором потока. Вместо него используйте threadId().
Возвращает идентификатор этого потока Thread. Идентификатор потока — это положительное число типа long, создаваемое при создании потока. Идентификатор потока уникален и остается неизменным в течение всего времени существования потока.
Возвращает:
идентификатор этого потока
Начиная с версии:
1.5

threadId

public final long threadId()
Возвращает идентификатор этого потока Thread. Идентификатор потока — это положительное число типа 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
См. также:
  • setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
  • getUncaughtExceptionHandler()
  • ThreadGroup.uncaughtException(Thread, Throwable)

getDefaultUncaughtExceptionHandler

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
Возвращает обработчик по умолчанию, вызываемый при неожиданном завершении потока из-за неперехваченного исключения. Если возвращаемое значение равно null, обработчик по умолчанию отсутствует.
Возвращает:
обработчик неперехваченных исключений по умолчанию для всех потоков
Начиная с версии:
1.5
См. также:
  • setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

getUncaughtExceptionHandler

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
Возвращает обработчик, вызываемый при неожиданном завершении этого потока из-за неперехваченного исключения. Если для этого потока явно не задан обработчик неперехваченных исключений, возвращается объект ThreadGroup этого потока, если только поток не завершился; в этом случае возвращается null.
Возвращает:
обработчик неперехваченных исключений для этого потока
Начиная с версии:
1.5

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задает обработчик, вызываемый при неожиданном завершении этого потока из-за неперехваченного исключения.

Поток может полностью контролировать реакцию на неперехваченные исключения, если явно задать для него обработчик неперехваченных исключений. Если такой обработчик не задан, его роль выполняет объект ThreadGroup потока.

Параметры:
ueh — объект, используемый в качестве обработчика неперехваченных исключений этого потока. Если null, у потока нет явно заданного обработчика.
Начиная с версии:
1.5
См. также:
  • setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
  • ThreadGroup.uncaughtException(Thread, Throwable)

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

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

Spec-Zone.ru

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