Spec-Zone.ru › OpenJDK 24

Класс 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 Reference, планировщик виртуальных потоков может настраиваться с помощью следующих системных свойств:
Системные свойства
Системное свойство Описание
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, так как поток не может быть клонирован осмысленно.
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()
Возвращает идентификатор этого потока.
String toString()
Возвращает строковое представление этого потока.
static void yield()
Подсказка для планировщика о том, что текущий поток готов уступить использование процессора.

Методы, унаследованные от класса java.lang.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 — целое число.

Для непустого задания вызов этого конструктора напрямую эквивалентен:

Thread.ofPlatform().unstarted(task); 
Параметры:
task - объект, метод run которого вызывается при запуске этого потока. Если null, то метод run этого класса ничего не делает.
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (group, task, gname), где gname является вновь сгенерированным именем. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Для непустой группы и задания, вызов этого конструктора напрямую эквивалентен:

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).

Для непустого задания и имени, вызов этого конструктора напрямую эквивалентен:

Thread.ofPlatform().name(name).unstarted(task); 
Параметры:
task - объект, метод run которого вызывается при запуске этого потока. Если null, то вызывается метод run() этого потока.
name - имя нового потока
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task, String name)
Инициализирует новый платформенный Thread, так что он использует task в качестве объекта run, имеет заданное name в качестве имени и принадлежит группе потоков, на которую ссылается group.

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

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

Для непустой группы, задания и имени, вызов этого конструктора напрямую эквивалентен:

Thread.ofPlatform().group(group).name(name).unstarted(task); 
Параметры:
group - группа потоков. Если null, то группа устанавливается в группу потоков текущего потока.
task - объект, метод run которого вызывается при запуске этого потока. Если null, то вызывается метод run() этого потока.
name - имя нового потока
См. также:
  • Наследование при создании потоков

Поток

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.

Для непустой группы, задачи и имени вызов этого конструктора напрямую эквивалентен:

Thread.ofPlatform().group(group).name(name).stackSize(stackSize).unstarted(task); 
Parameters:
group - группа потоков. Если null, группа устанавливается в группу потоков текущего потока.
task - объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name - имя нового потока
stackSize - желаемый размер стека для нового потока или ноль, чтобы указать, что этот параметр следует игнорировать.
Since:
1.4
See Also:
  • Наследование при создании потоков

Поток

public Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Инициализирует новый платформенный Thread, так что он имеет task в качестве объекта выполнения, имеет указанное name в качестве имени, принадлежит группе потоков, на которую ссылается group, имеет указанный stackSize и наследует начальные значения для переменных inheritThreadLocals, если inheritThreadLocals равны true.

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

Указание значения true для параметра inheritThreadLocals заставит этот конструктор вести себя точно так же, как Thread(ThreadGroup, Runnable, String, long) конструктор.

Для непустой группы, задачи и имени вызов этого конструктора напрямую эквивалентен:

Thread.ofPlatform()
      .group(group)
      .name(name)
      .stackSize(stackSize)
      .inheritInheritableThreadLocals(inheritInheritableThreadLocals)
      .unstarted(task); 
Parameters:
group - группа потоков. Если null, группа устанавливается в группу потоков текущего потока.
task - объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name - имя нового потока
stackSize - желаемый размер стека для нового потока, или ноль, чтобы указать, что этот параметр следует игнорировать
inheritInheritableThreadLocals - если true, наследовать начальные значения для переменных inheritThreadLocals от потока создания, в противном случае начальные значения не наследуются
Since:
9
See Also:
  • Наследование при создании потоков

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

currentThread

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

yield

public static void yield()
Подсказка планировщику, что текущий поток готов уступить свое текущее использование процессора. Планировщик свободен игнорировать эту подсказку.

Yield — это эвристическая попытка улучшить относительный прогресс между потоками, которые в противном случае чрезмерно используют ЦП. Его использование следует сочетать с подробным профилированием и тестированием производительности, чтобы убедиться, что он действительно оказывает желаемое влияние.

Редко уместно использовать этот метод. Он может быть полезен для отладки или тестирования, где он может помочь воспроизвести ошибки из-за гонок. Он также может быть полезен при проектировании конструкций управления параллелизмом, таких как те, что в пакете java.util.concurrent.locks.

sleep

public static void sleep(long millis) throws InterruptedException
Заставляет текущий выполняющийся поток спать (временно прекратить выполнение) в течение указанного количества миллисекунд, с учетом точности и точности системных таймеров и планировщиков. Поток не теряет владения никакими мониторами.
Parameters:
millis - продолжительность сна в миллисекундах
Throws:
IllegalArgumentException - если значение millis отрицательное
InterruptedException - если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения.

sleep

public static void sleep(long millis, int nanos) throws InterruptedException
Заставляет текущий выполняющийся поток спать (временно прекратить выполнение) в течение указанного количества миллисекунд плюс указанное количество наносекунд, с учетом точности и точности системных таймеров и планировщиков. Поток не теряет владения никакими мониторами.
Parameters:
millis - продолжительность сна в миллисекундах
nanos - 0-999999 дополнительные наносекунды для сна
Throws:
IllegalArgumentException - если значение millis отрицательное или значение nanos не находится в диапазоне 0-999999
InterruptedException - если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения.

sleep

public static void sleep(Duration duration) throws InterruptedException
Заставляет текущий выполняющийся поток спать (временно прекратить выполнение) в течение указанного интервала, с учетом точности и точности системных таймеров и планировщиков. Этот метод является пустым, если интервал отрицательный.
Parameters:
duration - интервал сна
Throws:
InterruptedException - если текущий поток прерывается во время сна. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения.
Since:
19

onSpinWait

public static void onSpinWait()
Указывает, что вызывающий метод временно не может продолжить работу, пока не произойдут одно или несколько действий со стороны других задач. Вызывая этот метод в каждом цикле цикла вращения, вызывающий поток указывает времени выполнения, что он ожидает бездействия. Время выполнения может предпринять действия для повышения производительности вызовов конструкций цикла вращения.
API Note:
В качестве примера рассмотрим метод в классе, который вращается в цикле, пока не будет установлено какое-либо флаг вне этого метода. Вызов метода 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 может выполнить инструкции процессора для обработки таких шаблонов кода более эффективным способом.

Since:
9
END_OF_DOCUMENT_MARKER

ofPlatform

public static Thread.Builder.OfPlatform ofPlatform()
Возвращает билдер для создания платформенной Thread или ThreadFactory, которая создаёт платформенные потоки.
API Note:
Ниже приведены примеры использования билдера:
  // 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 Note:
Ниже приведены примеры использования билдера:
  // 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, так как поток нельзя клонировать осмысленно. Создайте новый поток вместо этого.
Переопределяет:
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 Reference Implementation, прерывание потока, который не активен, всё ещё записывает, что запрос на прерывание был сделан, и сообщит об этом через 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 и максимального разрешённого приоритета группы потоков этого потока. Приоритет виртуального потока всегда NORM_PRIORITY и newPriority игнорируется.
Параметры:
newPriority - новый приоритет потока
Бросает:
IllegalArgumentException - если приоритет не находится в диапазоне от MIN_PRIORITY до MAX_PRIORITY.
См. также:
  • setPriority(int)
  • ThreadGroup.getMaxPriority()
END_OF_DOCUMENT_MARKER

getPriority

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

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

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

setName

public final void setName(String name)
Изменяет имя этого потока, присваивая ему значение аргумента name.
Примечание об реализации:
В реализации JDK, если этот поток является текущим потоком и это платформа потока, который не был присоединен к виртуальной машине с помощью функции Java Native Interface AttachCurrentThread, то этот метод установит имя потока операционной системы. Это может быть полезно для отладки и устранения неполадок.
Параметры:
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()
Возвращает строковое представление этого потока. Строковое представление обычно включает идентификатор и имя потока. В стандартной реализации для платформенных потоков включаются идентификатор, имя, приоритет потока и имя группы потоков.
Overrides:
toString в классе Object
Возвращает:
строковое представление этого потока.

getContextClassLoader

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

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

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

setContextClassLoader

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

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

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

holdsLock

public static boolean holdsLock(Object obj)
Возвращает true, если и только если текущий поток владеет мониторным замком на указанном объекте.

Этот метод предназначен для того, чтобы программа могла утверждать, что текущий поток уже владеет указанным замком:

     assert Thread.holdsLock(obj);
 
Parameters:
obj - объект, на котором проверяется владение замком
Returns:
true, если текущий поток владеет мониторным замком на указанном объекте.
Since:
1.4

getStackTrace

public StackTraceElement[] getStackTrace()
Возвращает массив элементов стека вызовов, представляющих дамп стека этого потока. Этот метод вернет массив нулевой длины, если этот поток не запущен, запущен, но еще не был запланирован для выполнения системой, или завершен. Если возвращаемый массив имеет ненулевую длину, то первый элемент массива представляет вершину стека, который является самым последним вызовом метода в последовательности. Последний элемент массива представляет основание стека, который является наименее последним вызовом метода в последовательности.

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

Returns:
массив элементов стека вызовов, каждый из которых представляет один кадр стека.
Since:
1.5
See Also:
  • Throwable.getStackTrace()

getAllStackTraces

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

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

Returns:
карта, отображающая Thread с Map на массив элементов стека вызовов, представляющий стековый след соответствующего потока.
Since:
1.5
See Also:
  • getStackTrace()
  • Throwable.getStackTrace()

getId

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

threadId

public final long threadId()
Возвращает идентификатор этого потока. Идентификатор потока — положительное целое число, сгенерированное при создании потока. Идентификатор потока уникален и остается неизменным в течение его жизненного цикла.
Returns:
ID этого потока
Since:
19

getState

public Thread.State getState()
Возвращает состояние этого потока. Этот метод предназначен для мониторинга состояния системы, а не для управления синхронизацией.
Returns:
состояние этого потока.
Since:
1.5

setDefaultUncaughtExceptionHandler

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

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

Установка обработчика по умолчанию позволяет приложению изменить способ обработки необработанных исключений (например, запись в определенное устройство или файл) для тех потоков, которые уже принимают какое-либо «стандартное» поведение системы.

Обратите внимание, что обработчик необработанных исключений по умолчанию обычно не должен обращаться к объекту ThreadGroup потока, поскольку это может привести к бесконечной рекурсии.

Parameters:
ueh - объект, используемый в качестве обработчика необработанных исключений по умолчанию. Если null, то обработчика по умолчанию нет.
Since:
1.5
See Also:
  • setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
  • getUncaughtExceptionHandler()
  • ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)

getDefaultUncaughtExceptionHandler

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

getUncaughtExceptionHandler

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

setUncaughtExceptionHandler

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

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

Parameters:
ueh - объект, используемый в качестве обработчика необработанных исключений этого потока. Если null, то у этого потока нет явного обработчика.
Since:
1.5
See Also:
  • setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
  • ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/Thread.html

Spec-Zone.ru

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