Класс Thread
- Все реализованные интерфейсы:
Runnable
- Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
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 |
Инициализирует новую платформенную Thread. |
Thread |
Инициализирует новую платформенную Thread. |
Thread |
Инициализирует новую платформенную Thread. |
Thread |
Инициализирует новую платформенную Thread. |
Thread |
Инициализирует новую платформенную Thread, используя task в качестве объекта запуска, заданное name в качестве имени и принадлежащую группе потоков, указанной в group. |
Thread |
Инициализирует новую платформенную Thread, используя task в качестве объекта запуска, заданное name в качестве имени, принадлежащую группе потоков, указанной в group, и указанный размер стека. |
Thread |
Инициализирует новую платформенную Thread, используя task в качестве объекта запуска, заданное name в качестве имени, принадлежащую группе потоков, указанной в group, имеющую указанный stackSize, и наследующую начальные значения для переменных наследуемых потоковых локалей, если inheritThreadLocals является true. |
Thread |
Инициализирует новую платформенную Thread. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static int |
activeCount() |
Возвращает оценку количества активных платформных потоков в группе потоков текущего потока и его подгруппах. |
final void |
checkAccess() |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод изначально определял, имеет ли текущий выполняющийся поток разрешение на изменение этого потока. |
protected Object |
clone() |
Бросает CloneNotSupportedException, так как поток не может быть клонирован осмысленно. |
static Thread |
currentThread() |
Возвращает объект Thread для текущего потока. |
static void |
dumpStack() |
Выводит трассировку стека текущего потока в поток стандартных ошибок. |
static int |
enumerate |
Копирует в указанный массив каждый активный платформенный поток в группе потоков текущего потока и его подгруппах. |
static Map |
getAllStackTraces() |
Возвращает карту трассировок стека для всех активных платформных потоков. |
ClassLoader |
getContextClassLoader() |
Возвращает контекст ClassLoader для этого потока. |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() |
Возвращает обработчик по умолчанию, вызываемый, когда поток неожиданно завершается из-за необработанного исключения. |
long |
getId() |
Устаревший. Этот метод не является final и может быть переопределён для возврата значения, которое не является идентификатором потока. |
final String |
getName() |
Возвращает имя этого потока. |
final int |
getPriority() |
Возвращает приоритет этого потока. |
StackTraceElement[] |
getStackTrace() |
Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока. |
Thread.State |
getState() |
Возвращает состояние этого потока. |
final ThreadGroup |
getThreadGroup() |
Возвращает группу потоков потока или null, если поток завершился. |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() |
Возвращает обработчик, вызываемый, когда этот поток неожиданно завершается из-за необработанного исключения. |
static boolean |
holdsLock |
Возвращает true только тогда, когда текущий поток владеет мониторным замком на указанном объекте. |
void |
interrupt() |
Прерывает этот поток. |
static boolean |
interrupted() |
Проверяет, был ли прерван текущий поток. |
final boolean |
isAlive() |
Проверяет, жив ли этот поток. |
final boolean |
isDaemon() |
Проверяет, является ли этот поток потоком демона. |
boolean |
isInterrupted() |
Проверяет, был ли прерван этот поток. |
final boolean |
isVirtual() |
Возвращает true, если этот поток является виртуальным потоком. |
final void |
join() |
Ожидает завершения этого потока. |
final void |
join |
Ожидает не более millis миллисекунд завершения этого потока. |
final void |
join |
Ожидает не более millis миллисекунд плюс nanos наносекунды завершения этого потока. |
final boolean |
join |
Ожидает завершения этого потока в течение заданного времени ожидания. |
static Thread.Builder.OfPlatform |
ofPlatform() |
Возвращает билдер для создания платформенного Thread или ThreadFactory, который создаёт платформенные потоки. |
static Thread.Builder.OfVirtual |
ofVirtual() |
Возвращает билдер для создания виртуального Thread или ThreadFactory, который создаёт виртуальные потоки. |
static void |
onSpinWait() |
Указывает, что вызывающая сторона временно не может продолжить выполнение до тех пор, пока не произойдёт одно или несколько действий со стороны других задач. |
void |
run() |
Этот метод выполняется потоком при его выполнении. |
void |
setContextClassLoader |
Устанавливает контекст ClassLoader для этого потока. |
final void |
setDaemon |
Помечает этот поток как демон или не-демон поток. |
static void |
setDefaultUncaughtExceptionHandler |
Устанавливает обработчик по умолчанию, вызываемый, когда поток неожиданно завершается из-за необработанного исключения, и для этого потока не определен никакой другой обработчик. |
final void |
setName |
Изменяет имя этого потока, сделав его равным аргументу name. |
final void |
setPriority |
Изменяет приоритет этого потока. |
void |
setUncaughtExceptionHandler |
Устанавливает обработчик, вызываемый, когда этот поток неожиданно завершается из-за необработанного исключения. |
static void |
sleep |
Заставляет текущий выполняемый поток спать (временно прекратить выполнение) на указанное количество миллисекунд, с учётом точности и достоверности системных таймеров и планировщиков. |
static void |
sleep |
Заставляет текущий выполняемый поток спать (временно прекратить выполнение) на указанное количество миллисекунд плюс указанное количество наносекунд, с учётом точности и достоверности системных таймеров и планировщиков. |
static void |
sleep |
Заставляет текущий выполняемый поток спать (временно прекратить выполнение) на указанную длительность, с учётом точности и достоверности системных таймеров и планировщиков. |
void |
start() |
Планирует запуск этого потока. |
static Thread |
startVirtualThread |
Создаёт виртуальный поток для выполнения задачи и планирует его выполнение. |
final void |
stop() |
Устаревший, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод изначально был предназначен для "остановки" потока-жертвы, заставив поток-жертву бросить ThreadDeath. |
final long |
threadId() |
Возвращает идентификатор этого потока. |
String |
toString() |
Возвращает строковое представление этого потока. |
static void |
yield() |
Подсказка для планировщика о том, что текущий поток готов уступить использование процессора. |
Подробное описание полей
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
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()
- 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
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
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клон этого экземпляра.
- Бросает:
-
CloneNotSupportedException- всегда - См. также:
startVirtualThread
public static Thread startVirtualThread(Runnable task)
Этот метод эквивалентен:
Thread.ofVirtual().start(task);
- Параметры:
-
task- объект для выполнения, когда поток выполняется - Возвращает:
- новый и запущенный виртуальный поток
- С:
- 21
- См. также:
isVirtual
public final boolean isVirtual()
true, если этот поток является виртуальным потоком. Виртуальный поток планируется виртуальной машиной Java, а не операционной системой.- Возвращает:
-
true, если этот поток является виртуальным потоком - С:
- 21
start
public void start()
Поток может быть запущен не более одного раза. В частности, поток не может быть перезапущен после завершения.
- Бросает:
-
IllegalThreadStateException- если поток уже был запущен
run
public void run()
Thread могут переопределить этот метод. Этот метод не предназначен для прямого вызова. Если этот поток является платформенным потоком, созданным с задачей Runnable, то вызов этого метода вызовет метод run задачи. Если этот поток является виртуальным потоком, то прямой вызов этого метода ничего не делает.
stop
@Deprecated(since="1.2", forRemoval=true) public final void stop()
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()
- Возвращает:
-
true, если текущий поток был прерван;falseв противном случае. - См. также:
isInterrupted
public boolean isInterrupted()
- Возвращает:
-
true, если этот поток был прерван;falseв противном случае. - См. также:
isAlive
public final boolean isAlive()
- Возвращает:
-
true, если этот поток жив;falseв противном случае.
setPriority
public final void setPriority(int newPriority)
newPriority и максимального разрешённого приоритета группы потоков этого потока. Приоритет виртуального потока всегда NORM_PRIORITY и newPriority игнорируется.- Параметры:
-
newPriority- новый приоритет потока - Бросает:
-
IllegalArgumentException- если приоритет не находится в диапазоне отMIN_PRIORITYдоMAX_PRIORITY. - См. также:
getPriority
public final int getPriority()
Приоритет виртуального потока всегда NORM_PRIORITY.
- Возвращает:
- приоритет этого потока.
- См. также:
setName
public final void setName(String name)
name.- Примечание об реализации:
- В реализации JDK, если этот поток является текущим потоком и это платформа потока, который не был присоединен к виртуальной машине с помощью функции Java Native Interface AttachCurrentThread, то этот метод установит имя потока операционной системы. Это может быть полезно для отладки и устранения неполадок.
- Параметры:
-
name- новое имя для этого потока. - Внешние спецификации
- См. также:
getName
public final String getName()
- Возвращает:
- имя этого потока.
- См. также:
getThreadGroup
public final ThreadGroup getThreadGroup()
null, если поток завершен. Группа потоков, возвращаемая для виртуального потока, является специальной группой потоков для виртуальных потоков.
- Возвращает:
- группу потоков этого потока или
null
activeCount
public static int activeCount()
Возвращаемое значение является лишь оценкой, поскольку количество потоков может динамически изменяться во время обхода внутренних структур данных и может зависеть от наличия определенных системных потоков. Этот метод предназначен в первую очередь для отладки и мониторинга.
- Возвращает:
- оценку количества активных платформных потоков в группе потоков текущего потока и в любой другой группе потоков, имеющей текущую группу потоков в качестве предка
enumerate
public static int enumerate(Thread[] tarray)
ThreadGroup.enumerate(Thread[]) группы потоков текущего потока. Виртуальные потоки не перечисляются этим методом. Приложение может использовать метод activeCount для получения оценки размера массива, однако если массив слишком короткий, чтобы содержать все потоки, дополнительные потоки игнорируются. Если важно получить каждый активный поток в группе потоков текущего потока и его подгруппах, вызывающий должен убедиться, что возвращаемое значение int строго меньше длины tarray.
Из-за внутренней гонки в этом методе рекомендуется использовать его только для отладки и мониторинга.
- Параметры:
-
tarray- массив, в который следует поместить список потоков - Возвращает:
- количество потоков, помещенных в массив
join
public final void join(long millis) throws InterruptedException
millis миллисекунд завершения этого потока. Значение таймаута 0 означает ожидание бесконечно. Этот метод возвращается немедленно без ожидания, если поток не был started.- Примечание об реализации:
- Для платформных потоков реализация использует цикл вызовов
this.wait, обусловленныхthis.isAlive. Когда поток завершается, вызывается методthis.notifyAll. Рекомендуется, чтобы приложения не использовалиwait,notifyилиnotifyAllдля экземпляровThread. - Параметры:
-
millis- время ожидания в миллисекундах - Исключения:
-
IllegalArgumentException- если значениеmillisотрицательно -
InterruptedException- если какой-либо поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.
join
public final void join(long millis, int nanos) throws InterruptedException
millis миллисекунд плюс nanos наносекунд завершения этого потока. Если оба аргумента равны 0, это означает ожидание бесконечно. Этот метод возвращается немедленно без ожидания, если поток не был started.- Примечание об реализации:
- Для платформных потоков реализация использует цикл вызовов
this.wait, обусловленныхthis.isAlive. Когда поток завершается, вызывается методthis.notifyAll. Рекомендуется, чтобы приложения не использовалиwait,notifyилиnotifyAllдля экземпляровThread. - Параметры:
-
millis- время ожидания в миллисекундах -
nanos- дополнительные0-999999наносекунды ожидания - Исключения:
-
IllegalArgumentException- если значениеmillisотрицательно или значениеnanosне находится в диапазоне0-999999 -
InterruptedException- если какой-либо поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.
join
public final void join() throws InterruptedException
Вызов этого метода ведет себя точно так же, как вызов
join(0)
- Исключения:
-
InterruptedException- если какой-либо поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.
join
public final boolean join(Duration duration) throws InterruptedException
Этот метод не ожидает, если время ожидания меньше или равно нулю. В этом случае метод просто проверяет, завершился ли поток.
- Параметры:
-
duration- максимальное время ожидания - Возвращает:
-
true, если поток завершился;false, если поток не завершился - Исключения:
-
InterruptedException- если текущий поток прерывается во время ожидания. Статус прерывания текущего потока сбрасывается при возникновении этого исключения. -
IllegalThreadStateException- если этот поток не был запущен. - С:
- 19
dumpStack
public static void dumpStack()
setDaemon
public final void setDaemon(boolean on)
Статус демона виртуального потока всегда true и не может быть изменен этим методом на false.
Этот метод должен быть вызван до запуска потока. Поведение этого метода, когда поток завершился, не определено.
- Параметры:
-
on- еслиtrue, помечает этот поток как демон-поток - Исключения:
-
IllegalArgumentException- если это виртуальный поток, аonравно false -
IllegalThreadStateException- если этот поток активен
isDaemon
public final boolean isDaemon()
true.- Возвращает:
-
true, если этот поток является демоновым потоком;falseв противном случае. - См. также:
checkAccess
@Deprecated(since="17", forRemoval=true) public final void checkAccess()
toString
public String toString()
getContextClassLoader
public ClassLoader getContextClassLoader()
Контекстный ClassLoader первоначального потока обычно устанавливается в ClassLoader, используемый для загрузки приложения.
- Возвращает:
- контекстный ClassLoader для этого потока, или значение, указывающее на системный ClassLoader (или, в случае его отсутствия, загрузчик начального класса).
- Since:
- 1.2
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
Контекстный ClassLoader может быть задан создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов.
- Parameters:
-
cl- контекстный ClassLoader для этого потока, или null, указывающий на системный ClassLoader (или, в случае его отсутствия, загрузчик начального класса) - Since:
- 1.2
holdsLock
public static boolean holdsLock(Object obj)
Этот метод предназначен для того, чтобы программа могла утверждать, что текущий поток уже владеет указанным замком:
assert Thread.holdsLock(obj);
- Parameters:
-
obj- объект, на котором проверяется владение замком - Returns:
-
true, если текущий поток владеет мониторным замком на указанном объекте. - Since:
- 1.4
getStackTrace
public StackTraceElement[] getStackTrace()
Некоторые виртуальные машины могут в некоторых случаях опустить один или несколько кадров стека из стекового следа. В крайнем случае, виртуальная машина, у которой нет информации о стеке вызовов данного потока, может вернуть массив нулевой длины из этого метода.
- Returns:
- массив элементов стека вызовов, каждый из которых представляет один кадр стека.
- Since:
- 1.5
- See Also:
getAllStackTraces
public static Map<Thread, StackTraceElement[]> getAllStackTraces()
getStackTrace. Потоки могут выполняться во время вызова этого метода. Стековый след каждого потока представляет собой только моментальный снимок, и каждый стековый след может быть получен в разное время. Массив нулевой длины будет возвращен в значении карты, если виртуальная машина не имеет информации о стеке вызовов данного потока.
- Returns:
- карта, отображающая
ThreadсMapна массив элементов стека вызовов, представляющий стековый след соответствующего потока. - Since:
- 1.5
- See Also:
getId
@Deprecated(since="19") public long getId()
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:
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
null, то обработчика по умолчанию нет.- Returns:
- обработчик необработанных исключений по умолчанию для всех потоков
- Since:
- 1.5
- See Also:
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:
© 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