Класс Thread
- Все реализованные интерфейсы:
Runnable
- Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Thread определяет конструкторы и Thread.Builder для создания потоков. Запуск потока планирует выполнение его метода run. Новый запущенный поток выполняется параллельно с потоком, который его запустил.
Поток завершается, если либо его метод run выполняется нормально, либо если его метод run завершается внезапно, и соответствующий обработчик необработанных исключений обработчик исключений завершается нормально или внезапно. При отсутствии кода для выполнения поток завершает свою работу. Метод join может использоваться для ожидания завершения потока.
Потоки имеют уникальный идентификатор и имя. Идентификатор генерируется при создании потока и не может быть изменён. Имя потока может быть указано при создании потока или может быть изменено позже.
Потоки поддерживают переменные ThreadLocal. Это переменные, локальные для потока, то есть поток может иметь копию переменной, значение которой независимо от значения, установленного другими потоками. Thread также поддерживает переменные InheritableThreadLocal, которые являются локальными для потока, наследуемыми при создании потока от родительского Thread. Thread поддерживает специальную наследуемую локальную переменную для класса загрузчика контекста потока.
Потоки платформы
Thread поддерживает создание платформенных потоков, которые обычно отображаются 1:1 на потоки ядра, планируемые операционной системой. У платформных потоков обычно большая стек и другие ресурсы, которые поддерживаются операционной системой. Платформенные потоки подходят для выполнения всех типов задач, но могут быть ограниченным ресурсом.
Платформенные потоки по умолчанию получают автоматически сгенерированное имя потока.
Платформенные потоки обозначаются как демённые или не-демённые потоки. При запуске виртуальной машины Java обычно существует один не-демённый поток (поток, который обычно вызывает метод приложения main). Последовательность завершения работы начинается, когда все запущенные не-демённые потоки завершились. Незапущенные не-демённые потоки не препятствуют началу последовательности завершения работы.
В дополнение к статусу демёна, платформные потоки имеют приоритет потока и являются членами группы потоков.
Виртуальные потоки
Thread также поддерживает создание виртуальных потоков. Виртуальные потоки обычно являются потоками пользовательского режима, планируемыми Java-машиной исполнения, а не операционной системой. Виртуальные потоки обычно требуют мало ресурсов, и одна Java-машина может поддерживать миллионы виртуальных потоков. Виртуальные потоки подходят для выполнения задач, которые большую часть времени блокированы, часто ожидая завершения операций ввода-вывода. Виртуальные потоки не предназначены для длительных операций с интенсивным использованием ЦП.
Виртуальные потоки обычно используют небольшой набор платформных потоков, используемых в качестве потоков-носителей. Блокировки и операции ввода-вывода являются примерами операций, при которых поток-носитель может быть перепланирован из одного виртуального потока в другой. Код, выполняемый в виртуальном потоке, не осведомлен об используемом потоке-носителе. Метод currentThread(), используемый для получения ссылки на текущий поток, всегда вернёт объект Thread для виртуального потока.
Виртуальные потоки по умолчанию не имеют имени потока. Метод getName возвращает пустую строку, если имя потока не задано.
Виртуальные потоки являются демёнными потоками и поэтому не препятствуют началу последовательности завершения работы. Виртуальные потоки имеют фиксированный приоритет потока, который нельзя изменить.
Создание и запуск потоков
Thread определяет публичные конструкторы для создания платформных потоков и метод start для планирования выполнения потоков. Thread может быть расширен для настройки и других расширенных целей, хотя большинство приложений в этом мало нуждаются.
Thread определяет API Thread.Builder для создания и запуска платформных и виртуальных потоков. Ниже приведены примеры с использованием этого API:
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. Конструктор с 5 параметрами конструктор можно использовать для создания потока, который не наследует начальные значения от создающего потока. При использовании Thread.Builder, метод inheritInheritableThreadLocals можно использовать для выбора, наследовать ли начальные значения. Платформные потоки наследуют статус демёна, приоритет потока и, если не указано иначе (или если не выбран менеджер безопасности), группу потоков.
Создание платформного потока захватывает контекст вызывающего потока для ограничения разрешений нового потока при выполнении кода, выполняющего привилегированную операцию privileged action. Захваченный контекст вызывающего потока является "Наследованным AccessControlContext" нового потока. Создание виртуального потока не захватывает контекст вызывающего потока; виртуальные потоки не имеют разрешений при выполнении кода, выполняющего привилегированную операцию.
Если не указано иное, передача аргумента null в конструктор или метод в этом классе вызовет исключение NullPointerException.
- Примечание по реализации:
- В реализации JDK Reference Implementation планировщик виртуальных потоков может быть настроен с помощью следующих системных свойств:
Системное свойство Описание 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 в качестве объекта run, указанное значение name в качестве имени и группу потоков, на которую ссылается group. |
Thread |
Инициализирует новый платформенный Thread, используя task в качестве объекта run, указанное значение name в качестве имени, группу потоков, на которую ссылается group, и указанный размер стека. |
Thread |
Инициализирует новый платформенный Thread, используя task в качестве объекта run, указанное значение name в качестве имени, группу потоков, на которую ссылается group, указанное значение stackSize, и наследует начальные значения для переменных наследуемых потоковых локалей, если inheritThreadLocals имеет значение true. |
Thread |
Инициализирует новый платформенный Thread. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static int |
activeCount() |
Возвращает оценку количества активных потоков платформы в группе потоков текущего потока и его подгруппах. |
final void |
checkAccess() |
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии. Этот метод полезен только в сочетании с менеджером безопасности, который устарел и может быть удален в будущей версии. |
protected Object |
clone() |
Бросает CloneNotSupportedException, так как поток не может быть скопирован осмысленно. |
int |
countStackFrames() |
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии. Этот метод изначально был предназначен для подсчета количества кадров стека, но результаты никогда не были четко определены и зависели от приостановки потоков. |
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() |
Указывает, что вызывающий процесс временно не может продолжить выполнение до выполнения одного или нескольких действий со стороны других задач. |
final void |
resume() |
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии. Этот метод изначально был задан для возобновления потока, приостановленного с помощью suspend(). |
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 void |
suspend() |
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии. Этот метод изначально был задан для приостановки потока. |
final long |
threadId() |
Возвращает идентификатор этого потока Thread. |
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и есть менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в текущую группу потоков. -
task- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - См. также:
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и есть менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в текущую группу потоков. -
name- имя нового потока - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - См. также:
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. Если есть менеджер безопасности, вызывается его метод checkAccess с группой потоков в качестве аргумента.
Кроме того, вызывается метод checkPermission с разрешением RuntimePermission("enableContextClassLoaderOverride") при вызове напрямую или косвенно конструктором подкласса, который переопределяет методы getContextClassLoader или setContextClassLoader.
Приоритет вновь созданного потока — меньший из приоритетов создающего его потока и максимального разрешённого приоритета группы потоков. Метод setPriority может использоваться для изменения приоритета на новое значение.
Новый поток изначально помечается как демон-поток тогда и только тогда, когда создающий его поток помечается как демон-поток. Метод setDaemon может использоваться для изменения статуса потока как демон-потока.
Для непустой группы, задачи и имени, вызов этого конструктора напрямую эквивалентен:
Thread.ofPlatform().group(group).name(name).unstarted(task);
- Параметры:
-
group- группа потоков. Еслиnullи есть менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в текущую группу потоков. -
task- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name- имя нового потока - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков или не может переопределить методы загрузчика класса контекста. - См. также:
Поток
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и существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если нет менеджера безопасности илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
task- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name- имя нового потока -
stackSize- желаемый размер стека для нового потока или ноль, чтобы указать, что этот параметр следует игнорировать. - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - С тех пор:
- 1.4
- См. также:
Поток
public Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Thread так, что у него task является объектом выполнения, у него указанное name в качестве имени, он принадлежит группе потоков, на которую ссылается group, имеет указанный stackSize, и наследует начальные значения для передаваемых по наследству локальных переменных потока, если inheritThreadLocals равно true. Этот конструктор идентичен конструктору Thread(ThreadGroup,Runnable,String,long) с добавленной возможностью подавления или отсутствия наследования начальных значений для передаваемых по наследству локальных переменных потока от создающего потока. Это позволяет более тонко управлять передаваемыми по наследству локальными переменными потока. Необходимо проявлять осторожность при передаче значения false для inheritThreadLocals, так как это может привести к неожиданному поведению, если новый поток выполняет код, который ожидает наследования конкретного значения локальной переменной потока.
Указание значения true для параметра inheritThreadLocals заставит этот конструктор вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String, long).
Для группы, задачи и имени, отличных от null, вызов этого конструктора напрямую эквивалентен:
Thread.ofPlatform()
.group(group)
.name(name)
.stackSize(stackSize)
.inheritInheritableThreadLocals(inheritInheritableThreadLocals)
.unstarted(task);
- Параметры:
-
group- группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если нет менеджера безопасности илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
task- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run этого потока. -
name- имя нового потока -
stackSize- желаемый размер стека для нового потока или ноль, чтобы указать, что этот параметр следует игнорировать -
inheritInheritableThreadLocals- еслиtrue, наследует начальные значения для передаваемых по наследству локальных переменных потока от создающего потока, в противном случае начальные значения не наследуются - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - С тех пор:
- 9
- См. также:
Подробное описание методов
currentThread
public static Thread currentThread()
- Возвращает:
- текущий поток
yield
public static void yield()
Yield — это эвристическая попытка улучшить относительное продвижение между потоками, которые в противном случае чрезмерно используют процессор. Его использование следует сочетать с подробным профилированием и бенчмаркингом, чтобы убедиться, что он действительно оказывает желаемый эффект.
Использование этого метода редко уместно. Он может быть полезен для отладки или тестирования, где он может помочь воспроизвести ошибки из-за гонок. Он также может быть полезен при проектировании конструкций управления параллелизмом, таких как те, что в пакете java.util.concurrent.locks.
sleep
public static void sleep(long millis) throws InterruptedException
- Параметры:
-
millis- длительность сна в миллисекундах - Исключения:
-
IllegalArgumentException- если значениеmillisотрицательное -
InterruptedException- если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения.
sleep
public static void sleep(long millis, int nanos) throws InterruptedException
- Параметры:
-
millis- длительность сна в миллисекундах -
nanos-0-999999дополнительные наносекунды сна - Исключения:
-
IllegalArgumentException- если значениеmillisотрицательное, или значениеnanosне находится в диапазоне0-999999 -
InterruptedException- если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения.
sleep
public static void sleep(Duration duration) throws InterruptedException
- Параметры:
-
duration- длительность сна - Исключения:
-
InterruptedException- если текущий поток прерывается во время сна. Состояние прерывания текущего потока сбрасывается при возникновении этого исключения. - С тех пор:
- 19
onSpinWait
public static void onSpinWait()
- Примечание API:
- В качестве примера рассмотрим метод в классе, который циклически ожидает, пока какой-либо флаг не будет установлен вне этого метода. Вызов метода
onSpinWaitдолжен быть помещён внутри цикла спин-ожидания.class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . } }Приведённый код останется корректным даже если метод
onSpinWaitвообще не вызывается. Однако на некоторых архитектурах Java Virtual Machine может выдать процессору инструкции для более эффективного обращения с такими кодовыми шаблонами. - С тех пор как:
- 9
ofPlatform
public static Thread.Builder.OfPlatform ofPlatform()
Thread или ThreadFactory, который создаёт платформенные потоки. Взаимодействие с менеджером безопасности при создании платформенных потоков
При создании платформенного потока, когда установлен менеджер безопасности, вызывается метод менеджера безопасности checkAccess(ThreadGroup) с группой потоков. Если группа потоков не была установлена методом OfPlatform.group, то сначала вызывается метод менеджера безопасности getThreadGroup для выбора группы потоков. Если метод менеджера безопасности getThreadGroup возвращает null, то используется группа потоков потока, выполняющего построение.
- Примечание API:
- Ниже приведены примеры использования билдера:
// Start a daemon thread to run a task Thread thread = Thread.ofPlatform().daemon().start(runnable); // Create an unstarted thread with name "duke", its start() method // must be invoked to schedule it to execute. Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable); // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ... ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory(); - Возвращает:
- Билдер для создания
ThreadилиThreadFactoryобъектов. - С тех пор как:
- 21
ofVirtual
public static Thread.Builder.OfVirtual ofVirtual()
Thread или ThreadFactory, который создаёт виртуальные потоки.- Примечание API:
- Ниже приведены примеры использования билдера:
// Start a virtual thread to run a task. Thread thread = Thread.ofVirtual().start(runnable); // A ThreadFactory that creates virtual threads ThreadFactory factory = Thread.ofVirtual().factory(); - Возвращает:
- Билдер для создания
ThreadилиThreadFactoryобъектов. - С тех пор как:
- 21
clone
protected Object clone() throws CloneNotSupportedException
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клон этого экземпляра.
- Бросает:
-
CloneNotSupportedException- всегда - См. также:
startVirtualThread
public static Thread startVirtualThread(Runnable task)
Этот метод эквивалентен:
Thread.ofVirtual().start(task);
- Параметры:
-
task- объект для выполнения, когда поток выполняется - Возвращает:
- новый и запущенный виртуальный поток
- С тех пор как:
- 21
- См. также:
isVirtual
public final boolean isVirtual()
true, если этот поток является виртуальным. Виртуальный поток планируется Java Virtual Machine, а не операционной системой.- Возвращает:
-
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()
ThreadDeath. Он был изначально небезопасным. Остановка потока приводила к разблокировке всех мониторов, которые он заблокировал (как естественное следствие распространения исключения ThreadDeath вверх по стеку). Если какие-либо из объектов, ранее защищаемых этими мониторами, находились в несогласованном состоянии, повреждённые объекты становились видимыми для других потоков, что потенциально приводило к произвольному поведению. Использование stop должно быть заменено кодом, который просто изменяет какую-либо переменную, чтобы указать целевому потоку, что ему нужно прекратить выполнение. Целевой поток должен регулярно проверять эту переменную и возвращаться из своего метода run в упорядоченном виде, если переменная указывает на необходимость остановки. Если целевой поток ждёт в течение длительного времени (например, на переменной состояния), следует использовать метод interrupt для прерывания ожидания. Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели?.UnsupportedOperationException.- Бросает:
-
UnsupportedOperationException- всегда
interrupt
public void interrupt()
Если текущий поток не прерывает сам себя (что всегда разрешено), вызывается метод checkAccess этого потока, что может вызвать исключение SecurityException.
Если этот поток заблокирован в вызове методов 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, прерывание потока, который не жив, всё ещё записывает запрос на прерывание и сообщит об этом через
interrupted()иisInterrupted(). - Бросает:
-
SecurityException- если текущий поток не может изменить этот поток
interrupted
public static boolean interrupted()
- Возвращает:
-
trueесли текущий поток был прерван;falseв противном случае. - См. также:
isInterrupted
public boolean isInterrupted()
- Возвращает:
-
trueесли этот поток был прерван;falseв противном случае. - См. также:
isAlive
public final boolean isAlive()
- Возвращает:
-
trueесли этот поток жив;falseв противном случае.
suspend
@Deprecated(since="1.2", forRemoval=true) public final void suspend()
resume, произошла бы тупиковая ситуация. Такие тупики обычно проявлялись как «зависшие» процессы. Дополнительную информацию см. в Почему Thread.stop, Thread.suspend и Thread.resume устарели?.UnsupportedOperationException.- Бросает:
-
UnsupportedOperationException— всегда
resume
@Deprecated(since="1.2", forRemoval=true) public final void resume()
suspend(). Приостановка потока была подвержена тупиковым ситуациям. Дополнительную информацию см. в Почему Thread.stop, Thread.suspend и Thread.resume устарели?.UnsupportedOperationException.- Бросает:
-
UnsupportedOperationException— всегда
setPriority
public final void setPriority(int newPriority)
newPriority и максимального разрешенного приоритета группы потоков данного потока. Приоритет виртуального потока всегда равен NORM_PRIORITY, и newPriority игнорируется.- Параметры:
-
newPriority— новый приоритет потока - Бросает:
-
IllegalArgumentException— если приоритет не находится в диапазоне отMIN_PRIORITYдоMAX_PRIORITY. -
SecurityException— еслиcheckAccess()определяет, что текущий поток не может изменить этот поток - См. также:
getPriority
public final int getPriority()
Приоритет виртуального потока всегда равен NORM_PRIORITY.
- Возвращает:
- приоритет этого потока.
- См. также:
setName
public final void setName(String name)
name. Сначала вызывается метод checkAccess этого потока без аргументов. Это может привести к выбрасыванию SecurityException.
- Примечание для реализации:
- В реализации JDK Reference Implementation, если этот поток является текущим потоком и это платформный поток, который не был присоединён к JVM с помощью функции Java Native Interface AttachCurrentThread, то этот метод установит имя потока операционной системы. Это может быть полезно для отладки и устранения неполадок.
- Параметры:
-
name— новое имя для этого потока. - Бросает:
-
SecurityException— если текущий поток не может изменить этот поток. - Внешние спецификации
- См. также:
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— массив, в который нужно поместить список потоков - Возвращает:
- количество потоков, помещённых в массив
- Бросает:
-
SecurityException— еслиThreadGroup.checkAccess()определяет, что текущий поток не может получить доступ к своей группе потоков
countStackFrames
@Deprecated(since="1.2", forRemoval=true) public int countStackFrames()
UnsupportedOperationException.- Возвращает:
- ничего
- См. также:
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- если этот поток активен -
SecurityException- еслиcheckAccess()определяет, что текущий поток не может изменить этот поток
isDaemon
public final boolean isDaemon()
true.- Возвращает:
-
trueесли этот поток является демоническим;falseв противном случае. - См. также:
checkAccess
@Deprecated(since="17", forRemoval=true) public final void checkAccess()
Если существует менеджер безопасности, вызывается его метод checkAccess с этим потоком в качестве аргумента. Это может привести к выбросу SecurityException.
- Исключения:
-
SecurityException- если текущий поток не имеет разрешения на доступ к этому потоку. - См. также:
toString
public String toString()
- Переопределяет:
-
toStringв классеObject - Возвращает:
- строковое представление этого потока.
getContextClassLoader
public ClassLoader getContextClassLoader()
ClassLoader для этого потока. Контекстный ClassLoader может быть установлен создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов. Если не установлен, по умолчанию используется контекстный загрузчик родительского потока. Контекстный ClassLoader первоначального потока обычно устанавливается на загрузчик классов, используемый для загрузки приложения.
- Возвращает:
- контекстный
ClassLoaderдля этого потока илиnullуказывающий на системный загрузчик классов (или, в случае его отсутствия, загрузчик начальной загрузки) - Исключения:
-
SecurityException- если менеджер безопасности присутствует, и загрузчик классов вызывающего неnullи не идентичен или не является предком контекстного загрузчика классов, и у вызывающего нет разрешенияRuntimePermission("getClassLoader") - С:
- 1.2
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
ClassLoader для этого потока. Контекстный ClassLoader может быть установлен создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов.
Если менеджер безопасности присутствует, вызывается его метод checkPermission с разрешением RuntimePermission
("setContextClassLoader") для проверки разрешения на установку контекстного загрузчика классов.
- Параметры:
-
cl- контекстный загрузчик классов для этого потока или null, указывающий на системный загрузчик классов (или, в случае его отсутствия, загрузчик начальной загрузки) - Исключения:
-
SecurityException- если текущий поток не может установить контекстный загрузчик классов - С:
- 1.2
holdsLock
public static boolean holdsLock(Object obj)
true тогда и только тогда, когда текущий поток владеет мониторным замком на указанном объекте. Этот метод разработан для того, чтобы программа могла утверждать, что текущий поток уже владеет указанным замком:
assert Thread.holdsLock(obj);
- Параметры:
-
obj- объект, для которого необходимо проверить владение замком - Возвращает:
-
trueесли текущий поток владеет мониторным замком на указанном объекте. - С:
- 1.4
getStackTrace
public StackTraceElement[] getStackTrace()
Если есть менеджер безопасности, и этот поток не является текущим, то вызывается метод менеджера безопасности checkPermission с разрешением RuntimePermission("getStackTrace") для проверки разрешения на получение трассировки стека.
В некоторых виртуальных машинах в некоторых обстоятельствах один или несколько кадров стека могут быть пропущены из трассировки стека. В крайнем случае виртуальная машина, не имеющая информации о трассировке стека для этого потока, имеет право вернуть массив нулевой длины из этого метода.
- Возвращает:
- массив
StackTraceElement, каждый представляет один кадр стека. - Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionне разрешает получение трассировки стека потока. - С:
- 1.5
- См. также:
getAllStackTraces
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
StackTraceElement, представляющие дамп стека соответствующего Thread. Возвращаемые трассировки стека имеют формат, указанный для метода getStackTrace. Потоки могут выполняться во время вызова этого метода. Трассировка стека каждого потока представляет собой только моментальный снимок, и каждая трассировка стека может быть получена в разное время. Массив нулевой длины будет возвращён в значении карты, если виртуальная машина не имеет информации о трассировке стека для данного потока.
Если существует менеджер безопасности, то вызывается метод checkPermission менеджера безопасности с разрешением RuntimePermission("getStackTrace"), а также разрешением RuntimePermission("modifyThreadGroup"), чтобы проверить, разрешено ли получение трассировки стека всех потоков.
- Returns:
- a
MapотThreadдо массиваStackTraceElement, представляющего трассировку стека соответствующего потока. - Throws:
-
SecurityException- если существует менеджер безопасности, и его методcheckPermissionне позволяет получить трассировку стека потока. - Since:
- 1.5
- See Also:
getId
@Deprecated(since="19") public long getId()
threadId() вместо этого.long число, сгенерированное при создании этого потока. Идентификатор потока уникален и остается неизменным в течение всего его жизненного цикла.- Returns:
- Идентификатор этого потока
- Since:
- 1.5
threadId
public final long threadId()
long число, сгенерированное при создании этого потока. Идентификатор потока уникален и остается неизменным в течение всего его жизненного цикла.- Returns:
- Идентификатор этого потока
- 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, обработчика по умолчанию нет. - Throws:
-
SecurityException- если присутствует менеджер безопасности, и он отказывается предоставитьRuntimePermission("setDefaultUncaughtExceptionHandler") - 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, у этого потока нет явного обработчика. - Throws:
-
SecurityException- если текущий поток не имеет права изменить этот поток. - Since:
- 1.5
- See Also:
© 1993, 2023, 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/21/docs/api/java.base/java/lang/Thread.html