Класс Thread
- Все реализуемые интерфейсы:
Runnable
- Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Каждый поток имеет приоритет. Потоки с более высоким приоритетом выполняются в предпочтительном порядке по сравнению с потоками с более низким приоритетом. Каждый поток также может или не может быть помечен как демонический. Когда код, выполняемый в некотором потоке, создаёт новый Thread объект, приоритет нового потока изначально устанавливается равным приоритету создающего потока, а также является демоническим потоком тогда и только тогда, когда создающий поток является демоническим.
При запуске Java Virtual Machine обычно существует один не-демонический поток (который, как правило, вызывает метод с именем main некоторого выделенного класса). Java Virtual Machine продолжает выполнять потоки, пока не произойдёт одно из следующих событий:
- Метод
exitклассаRuntimeбыл вызван, и менеджер безопасности разрешил операцию выхода. - Все потоки, которые не являются демоническими, умерли, либо вернувшись из вызова метода
run, либо сбросив исключение, которое распространяется за пределы методаrun.
Существует два способа создания нового потока выполнения. Один — объявить класс подклассом Thread. Этот подкласс должен переопределить метод run класса Thread. Затем можно создать экземпляр подкласса и запустить его. Например, поток, вычисляющий простые числа, большие, чем указанное значение, можно записать следующим образом:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
Следующий код затем создаст поток и запустит его:
PrimeThread p = new PrimeThread(143);
p.start();
Другой способ создания потока — объявить класс, который реализует интерфейс Runnable. Затем этот класс реализует метод run. Затем можно создать экземпляр класса, передать его в качестве аргумента при создании Thread, и запустить его. Тот же пример в этом другом стиле выглядит следующим образом:
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
Следующий код затем создаст поток и запустит его:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
Каждый поток имеет имя для целей идентификации. Более одного потока может иметь одинаковое имя. Если имя не указано при создании потока, для него генерируется новое имя.
Если не указано иное, передача аргумента null в конструктор или метод в этом классе приведёт к тому, что будет выброшено исключение NullPointerException.
- С момента:
- 1.0
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
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, так что у него target в качестве объекта run, указанное name в качестве имени и принадлежит группе потоков, указанной group. |
Thread |
Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени и принадлежит группе потоков, указанной group, и имеет указанный размер стека. |
Thread |
Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени, принадлежит группе потоков, указанной group, имеет указанный stackSize, и наследует начальные значения для переменных inheritable thread-local, если inheritThreadLocals является true. |
Thread |
Выделяет новый объект Thread. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static int |
activeCount() |
Возвращает оценку количества активных потоков в группе потоков текущего потока и его подгруппах. |
final void |
checkAccess() |
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод полезен только в сочетании с менеджером безопасности, который устарел и может быть удалён в будущей версии. |
protected Object |
clone() |
Бросает CloneNotSupportedException, так как поток не может быть осмысленно клонирован. |
int |
countStackFrames() |
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод изначально был разработан для подсчёта числа кадров стека, но результаты никогда не были чётко определены и зависели от приостановки потока. |
static Thread |
currentThread() |
Возвращает ссылку на объект текущего выполняющегося потока. |
static void |
dumpStack() |
Выводит трассировку стека текущего потока в стандартный поток ошибок. |
static int |
enumerate |
Копирует в указанный массив каждый активный поток в группе потоков текущего потока и его подгруппах. |
static Map<Thread, |
getAllStackTraces() |
Возвращает карту трассировок стека для всех активных потоков. |
ClassLoader |
getContextClassLoader() |
Возвращает контекст ClassLoader для этого потока. |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() |
Возвращает обработчик по умолчанию, вызываемый, когда поток неожиданно завершается из-за необработанного исключения. |
long |
getId() |
Возвращает идентификатор этого потока. |
final String |
getName() |
Возвращает имя этого потока. |
final int |
getPriority() |
Возвращает приоритет этого потока. |
StackTraceElement[] |
getStackTrace() |
Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока. |
Thread.State |
getState() |
Возвращает состояние этого потока. |
final ThreadGroup |
getThreadGroup() |
Возвращает группу потоков, к которой принадлежит этот поток. |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() |
Возвращает обработчик, вызываемый, когда этот поток неожиданно завершается из-за необработанного исключения. |
static boolean |
holdsLock |
Возвращает true, если и только если текущий поток удерживает блокировку монитора на указанном объекте. |
void |
interrupt() |
Прерывает этот поток. |
static boolean |
interrupted() |
Проверяет, был ли прерван текущий поток. |
final boolean |
isAlive() |
Проверяет, жив ли этот поток. |
final boolean |
isDaemon() |
Проверяет, является ли этот поток демоническим потоком. |
boolean |
isInterrupted() |
Проверяет, был ли прерван этот поток. |
final void |
join() |
Ожидает завершения этого потока. |
final void |
join |
Ожидает не более millis миллисекунд завершения этого потока. |
final void |
join |
Ожидает не более millis миллисекунд плюс nanos наносекунд завершения этого потока. |
static void |
onSpinWait() |
Указывает, что вызывающая сторона временно не может продолжить работу, до тех пор, пока не произойдут одно или несколько действий со стороны других задач. |
final void |
resume() |
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод существует только для использования с suspend(), который устарел, так как он подвержен тупиковым ситуациям. |
void |
run() |
Если этот поток был создан с использованием отдельного объекта Runnable run, то метод Runnable этого объекта run вызывается; в противном случае этот метод ничего не делает и возвращает. |
void |
setContextClassLoader |
Устанавливает загрузчик классов контекста для этого потока. |
final void |
setDaemon |
Помечает этот поток как демонический поток или поток пользователя. |
static void |
setDefaultUncaughtExceptionHandler |
Устанавливает обработчик по умолчанию, вызываемый, когда поток неожиданно завершается из-за необработанного исключения, и для этого потока не был определён другой обработчик. |
final void |
setName |
Изменяет имя этого потока на равное аргументу name. |
final void |
setPriority |
Изменяет приоритет этого потока. |
void |
setUncaughtExceptionHandler |
Устанавливает обработчик, вызываемый, когда этот поток неожиданно завершается из-за необработанного исключения. |
static void |
sleep |
Принуждает текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное количество миллисекунд, с учётом точности и надёжности системных таймеров и планировщиков. |
static void |
sleep |
Принуждает текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное количество миллисекунд плюс указанное количество наносекунд, с учётом точности и надёжности системных таймеров и планировщиков. |
void |
start() |
Запускает этот поток; виртуальная машина Java вызывает метод run этого потока. |
final void |
stop() |
Устаревшее. Этот метод потенциально небезопасен. |
final void |
suspend() |
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии. Этот метод устарел, так как он потенциально может привести к тупиковой ситуации. |
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
public Thread(Runnable target)
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, target, gname), где gname — новое сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.- Параметры:
-
target— объект, методrunкоторого вызывается при запуске потока. Еслиnull, методrunэтого класса ничего не делает.
Thread
public Thread(ThreadGroup group, Runnable target)
Thread. Этот конструктор имеет тот же эффект, что и Thread (group, target, gname) , где gname — новое сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.- Параметры:
-
group— группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target— объект, методrunкоторого вызывается при запуске потока. Еслиnull, вызывается метод run текущего потока. - Исключения:
-
SecurityException— если текущий поток не может создать поток в указанной группе потоков
Thread
public Thread(String name)
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, null, name).- Параметры:
-
name— имя нового потока
Thread
public Thread(ThreadGroup group, String name)
Thread. Этот конструктор имеет тот же эффект, что и Thread (group, null, name).- Параметры:
-
group— группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
name— имя нового потока - Исключения:
-
SecurityException— если текущий поток не может создать поток в указанной группе потоков
Thread
public Thread(Runnable target, String name)
Thread. Этот конструктор имеет тот же эффект, что и Thread (null, target, name).- Параметры:
-
target— объект, методrunкоторого вызывается при запуске потока. Еслиnull, вызывается метод run потока. -
name— имя нового потока
Thread
public Thread(ThreadGroup group, Runnable target, String name)
Thread так, чтобы у него target было объектом run, у него было указанное name в качестве имени и он принадлежал группе потоков, на которую ссылается group. Если есть менеджер безопасности, вызывается его метод checkAccess с группой потоков в качестве аргумента.
Кроме того, его метод checkPermission вызывается с разрешением RuntimePermission("enableContextClassLoaderOverride") при прямом или косвенном вызове конструктора подкласса, который переопределяет методы getContextClassLoader или setContextClassLoader.
Приоритет вновь созданного потока устанавливается равным приоритету потока, создавшего его, то есть текущему потоку. Метод setPriority может использоваться для изменения приоритета на новое значение.
Вновь созданный поток по умолчанию отмечается как демон-поток, если и только если поток, создавший его, в данный момент отмечается как демон-поток. Метод setDaemon может использоваться для изменения статуса потока в качестве демон-потока.
- Параметры:
-
group— группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target— объект, методrunкоторого вызывается при запуске потока. Еслиnull, вызывается метод run текущего потока. -
name— имя нового потока - Исключения:
-
SecurityException— если текущий поток не может создать поток в указанной группе потоков или не может переопределить методы контекстного загрузчика классов.
Поток
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread, у которого объект запуска target, заданное имя name, группа потоков, на которую ссылается group, и указанный размер стека.
Этот конструктор идентичен Thread(ThreadGroup,Runnable,String) за исключением возможности указать размер стека потока. Размер стека — это приблизительное количество байтов адресного пространства, которое виртуальная машина должна выделить для стека этого потока. Влияние параметра stackSize, если таковое имеется, сильно зависит от платформы.
На некоторых платформах задание большего значения для параметра stackSize может позволить потоку достичь большей глубины рекурсии перед выбросом исключения StackOverflowError. Аналогично, задание меньшего значения может позволить большему количеству потоков существовать одновременно без выброса исключения OutOfMemoryError (или другой внутренней ошибки). Подробности взаимосвязи между значением параметра stackSize и максимальной глубиной рекурсии и уровнем одновременности зависят от платформы. На некоторых платформах значение параметра stackSize может вообще никак не повлиять.
Виртуальная машина свободна обрабатывать параметр stackSize как рекомендацию. Если заданное значение слишком мало для платформы, виртуальная машина может вместо этого использовать некоторое платформа-зависимое минимальное значение; если заданное значение слишком велико, виртуальная машина может вместо этого использовать некоторое платформа-зависимое максимальное значение. Также виртуальная машина свободна округлять заданное значение вверх или вниз по своему усмотрению (или полностью игнорировать его).
Задание значения нуль для параметра stackSize заставит этот конструктор вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String).
Из-за зависимости поведения этого конструктора от платформы, следует проявлять особую осторожность при его использовании. Размер стека потока, необходимый для выполнения заданного вычисления, скорее всего, будет различаться в разных реализациях JRE. В свете этой вариативности может потребоваться тщательная настройка параметра размера стека, и эта настройка может потребоваться повторить для каждой реализации JRE, на которой будет работать приложение.
Примечание для реализации: разработчики платформ Java должны документировать поведение своей реализации по отношению к параметру stackSize.
- Parameters:
-
group- группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run текущего потока. -
name- имя нового потока -
stackSize- желаемый размер стека нового потока или ноль для игнорирования этого параметра. - Throws:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - Since:
- 1.4
Поток
public Thread(ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals)
Thread, у которого объект запуска target, заданное имя name, группа потоков, на которую ссылается group, указанный stackSize, и наследуются начальные значения для локальных переменных inheritThreadLocals, если inheritThreadLocals равно true.
Этот конструктор идентичен Thread(ThreadGroup,Runnable,String,long) с добавлением возможности подавления или наследования начальных значений локальных переменных потока от создающего потока. Это позволяет более тонко контролировать наследование локальных переменных потока. Следует проявлять осторожность при передаче значения false для inheritThreadLocals, так как это может привести к неожиданному поведению, если новый поток выполнит код, который ожидает наследования определённого значения локальной переменной.
Задание значения true для параметра inheritThreadLocals заставит этот конструктор вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String, long).
- Parameters:
-
group- группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target- объект, методrunкоторого вызывается при запуске этого потока. Еслиnull, вызывается метод run текущего потока. -
name- имя нового потока -
stackSize- желаемый размер стека нового потока или ноль для игнорирования этого параметра -
inheritThreadLocals- еслиtrue, наследовать начальные значения локальных переменных потока от создающего потока, иначе начальные значения не наследуются - Throws:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - Since:
- 9
Подробное описание методов
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- если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока сбрасывается при выбросе этого исключения.
onSpinWait
public static void onSpinWait()
- API Note:
- В качестве примера рассмотрим метод в классе, который вращается в цикле до тех пор, пока какой-то флаг не будет установлен за пределами этого метода. Вызов метода
onSpinWaitследует разместить внутри цикла ожидания вращения.class EventHandler { volatile boolean eventNotificationNotReceived; void waitForEventAndHandleIt() { while ( eventNotificationNotReceived ) { java.lang.Thread.onSpinWait(); } readAndProcessEvent(); } void readAndProcessEvent() { // Read event from some source and process it . . . } }Код выше останется корректным, даже если метод
onSpinWaitне вызывался вообще. Однако на некоторых архитектурах виртуальная машина Java может выдать инструкции процессору для обработки таких шаблонов кода более выгодным образом. - Since:
- 9
clone
protected Object clone() throws CloneNotSupportedException
- Overrides:
-
cloneв классеObject - Returns:
- клонированная копия этого экземпляра.
- Throws:
-
CloneNotSupportedException- всегда - See Also:
start
public void start()
run этой нити. В результате будут выполняться две нити одновременно: текущая нить (которая возвращается из вызова метода start) и другая нить (которая выполняет свой метод run).
Запускать нить более одного раза недопустимо. В частности, нить нельзя перезапустить после завершения выполнения.
run
public void run()
Runnable run, то вызывается метод Runnable этого объекта run; в противном случае этот метод ничего не делает и возвращает значение. Подклассы Thread должны переопределять этот метод.
- Specified by:
-
runв интерфейсеRunnable - See Also:
stop
@Deprecated(since="1.2") public final void stop()
ThreadDeath вверх по стеку). Если любой из объектов, ранее защищённых этими мониторами, находился в несогласованном состоянии, повреждённые объекты становятся видимыми для других нитей, что может привести к произвольному поведению. Многие случаи использования stop следует заменить кодом, который просто изменяет некоторую переменную, чтобы указать целевой нити на остановку выполнения. Целевая нить должна регулярно проверять эту переменную и возвращаться из своего метода run в упорядоченном порядке, если переменная указывает на необходимость остановки выполнения. Если целевая нить ожидает в течение длительного времени (например, на переменной условия), следует использовать метод interrupt для прерывания ожидания. Более подробную информацию см. на странице Почему Thread.stop, Thread.suspend и Thread.resume устарели?. Если установлен менеджер безопасности, вызывается его метод checkAccess с this в качестве аргумента. Это может привести к возбуждению SecurityException (в текущей нити).
Если эта нить отличается от текущей нити (то есть текущая нить пытается остановить нить, отличную от себя), дополнительно вызывается метод менеджера безопасности checkPermission (с аргументом RuntimePermission("stopThread")). Опять же, это может привести к возбуждению SecurityException (в текущей нити).
Представленная этим объектом нить принудительно останавливается от выполнения и выбрасывает новый объект ThreadDeath в виде исключения.
Разрешается остановить нить, которая ещё не запущена. Если нить в конечном итоге запустится, она немедленно завершится.
Приложение обычно не должно пытаться перехватывать ThreadDeath , если только не требуется выполнить какую-то особую операцию очистки (обратите внимание, что возбуждение ThreadDeath приводит к выполнению блоков finally в операторах try перед официальной смертью нити). Если блок catch перехватывает объект ThreadDeath, важно перебросить объект, чтобы нить действительно умерла.
Обработчик ошибок верхнего уровня, реагирующий на непрерывно неперехваченные исключения, не выводит сообщение и не уведомляет приложение, если непрерывно неперехваченное исключение является экземпляром ThreadDeath.
- Throws:
-
SecurityException- если текущая нить не может изменить эту нить. - See Also:
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 селектора.
Если ни одно из предыдущих условий не выполняется, статус прерывания этой нити будет установлен.
Прерывание нити, которая не активна, может не иметь никакого эффекта.
- Implementation Note:
- В реализации JDK, прерывание нити, которая не активна, всё же записывает запрос прерывания и будет сообщать об этом через
interruptedиisInterrupted(). - Throws:
-
SecurityException- если текущая нить не может изменить эту нить
interrupted
public static boolean interrupted()
- Returns:
-
trueесли текущая нить была прервана;falseв противном случае. - See Also:
isInterrupted
public boolean isInterrupted()
- Returns:
-
trueесли эта нить была прервана;falseв противном случае. - See Also:
isAlive
public final boolean isAlive()
- Returns:
-
trueесли эта нить активна;falseв противном случае.
suspend
@Deprecated(since="1.2", forRemoval=true) public final void suspend()
resume, возникает тупиковая ситуация. Такие тупиковые ситуации обычно проявляются как «зависшие» процессы. Более подробную информацию см. на странице Почему Thread.stop, Thread.suspend и Thread.resume устарели?. Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к возбуждению SecurityException (в текущей нити).
Если нить активна, она приостанавливается и не делает дальнейшего прогресса, пока не будет возобновлена.
- Throws:
-
SecurityException- если текущая нить не может изменить эту нить. - See Also:
resume
@Deprecated(since="1.2", forRemoval=true) public final void resume()
suspend(), который устарел, так как может привести к тупику. Дополнительную информацию можно найти в Почему Thread.stop, Thread.suspend и Thread.resume устарели?. Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к исключению SecurityException (в текущей нити).
Если нить активна, но приостановлена, она возобновляется и ей разрешается продолжить выполнение.
- Throws:
-
SecurityException- если текущая нить не может изменить эту нить. - См. также:
setPriority
public final void setPriority(int newPriority)
Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к исключению SecurityException.
В противном случае приоритет этой нити устанавливается как меньшее из указанного newPriority и максимального разрешенного приоритета группы нитей этой нити.
- Параметры:
-
newPriority- приоритет, который нужно установить для этой нити - Throws:
-
IllegalArgumentException- если приоритет не находится в диапазонеMIN_PRIORITYдоMAX_PRIORITY. -
SecurityException- если текущая нить не может изменить эту нить. - См. также:
getPriority
public final int getPriority()
- Возвращает:
- приоритет этой нити.
- См. также:
setName
public final void setName(String name)
name. Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к исключению SecurityException.
- Параметры:
-
name- новое имя для этой нити. - Throws:
-
SecurityException- если текущая нить не может изменить эту нить. - См. также:
getName
public final String getName()
- Возвращает:
- имя этой нити.
- См. также:
getThreadGroup
public final ThreadGroup getThreadGroup()
- Возвращает:
- группу нитей этой нити.
activeCount
public static int activeCount()
Возвращаемое значение является лишь оценкой, так как количество нитей может динамически изменяться во время прохода по внутренним структурам данных, и может быть затронуто наличием определённых системных нитей. Этот метод предназначен в первую очередь для отладки и мониторинга.
- Возвращает:
- оценку количества активных нитей в группе нитей текущей нити и в любой другой группе нитей, имеющей группу нитей текущей нити как предка
enumerate
public static int enumerate(Thread[] tarray)
ThreadGroup.enumerate(Thread[]) группы нитей текущей нити. Приложение может использовать метод activeCount для получения оценки того, насколько большим должен быть массив, однако если массив недостаточно велик, чтобы вместить все нити, лишние нити игнорируются. Если крайне важно получить все активные нити в группе нитей текущей нити и её подгруппах, вызывающий должен проверить, что возвращаемое значение int строго меньше длины tarray.
Из-за неминуемого состояния гонки в этом методе рекомендуется использовать его только для отладки и мониторинга.
- Параметры:
-
tarray- массив, в который следует поместить список нитей - Возвращает:
- количество нитей, помещённых в массив
- Throws:
-
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 означает ожидание бесконечно. Эта реализация использует цикл вызовов this.wait с условием this.isAlive. Когда нить завершается, вызывается метод this.notifyAll. Рекомендуется, чтобы приложения не использовали wait, notify, или notifyAll для экземпляров Thread.
- Параметры:
-
millis- время ожидания в миллисекундах - Throws:
-
IllegalArgumentException- если значениеmillisотрицательное -
InterruptedException- если какая-либо нить прервала текущую нить. Статус прерывания текущей нити сбрасывается при выбрасывании этого исключения.
join
public final void join(long millis, int nanos) throws InterruptedException
millis миллисекунд плюс nanos наносекунд, пока эта нить не завершит свою работу. Если оба аргумента 0, это означает ожидание бесконечно. Эта реализация использует цикл вызовов this.wait с условием this.isAlive. Когда нить завершается, вызывается метод this.notifyAll. Рекомендуется, чтобы приложения не использовали wait, notify, или notifyAll для экземпляров Thread.
- Параметры:
-
millis- время ожидания в миллисекундах -
nanos- дополнительные наносекунды ожидания - Throws:
-
IllegalArgumentException- если значениеmillisотрицательное, или значениеnanosне в диапазоне0-999999 -
InterruptedException- если какая-либо нить прервала текущую нить. Статус прерывания текущей нити сбрасывается при выбрасывании этого исключения.
join
public final void join() throws InterruptedException
Вызов этого метода ведёт себя точно так же, как вызов
join(0)
- Throws:
-
InterruptedException- если какая-либо нить прервала текущую нить. Статус прерывания текущей нити сбрасывается при выбрасывании этого исключения.
dumpStack
public static void dumpStack()
setDaemon
public final void setDaemon(boolean on)
Этот метод должен быть вызван до запуска нити.
- Параметры:
-
on- еслиtrue, помечает эту нить как демоническую - Throws:
-
IllegalThreadStateException- если эта нить активна -
SecurityException- еслиcheckAccess()определяет, что текущая нить не может изменить эту нить
isDaemon
public final boolean isDaemon()
- Возвращает:
-
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 первоначального потока обычно устанавливается в загрузчик классов, используемый для загрузки приложения.- Возвращает:
- контекстный
ClassLoaderдля этого потока илиnull, указывающий на системный загрузчик классов (или, при отсутствии такового, загрузчик Bootstrap). - Исключения:
-
SecurityException- если присутствует менеджер безопасности, и загрузчик класса вызывающего объекта неnullи не совпадает с контекстным загрузчиком классов или не является его предком, и вызывающий объект не имеет разрешенияRuntimePermission("getClassLoader") - С тех пор как:
- 1.2
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
getContextClassLoader, коду, выполняющемуся в потоке при загрузке классов и ресурсов.
Если присутствует менеджер безопасности, вызывается его метод checkPermission с разрешением RuntimePermission
("setContextClassLoader") , чтобы проверить, разрешено ли установить контекстный загрузчик классов.
- Параметры:
-
cl- контекстный загрузчик классов для этого потока или null, указывающий на системный загрузчик классов (или, при отсутствии такового, загрузчик Bootstrap). - Исключения:
-
SecurityException- если текущий поток не может установить контекстный загрузчик классов. - С тех пор как:
- 1.2
holdsLock
public static boolean holdsLock(Object obj)
true тогда и только тогда, когда текущий поток владеет мониторным замком на указанный объект.
Этот метод предназначен для того, чтобы программа могла утверждать, что текущий поток уже владеет указанным замком:
assert Thread.holdsLock(obj);
- Параметры:
-
obj- объект, для которого проверяется владение замком. - Возвращает:
-
true, если текущий поток владеет мониторным замком на указанный объект. - Исключения:
-
NullPointerException- если obj являетсяnull - С тех пор как:
- 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") для проверки, можно ли получить дамп стека всех потоков.
- Возвращает:
- карту
MapотThreadдо массиваStackTraceElement, который представляет собой дамп стека соответствующего потока. - Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionне позволяет получить дамп стека потока. - С тех пор как:
- 1.5
- См. также:
getId
public long getId()
long число, сгенерированное при создании этого потока. Идентификатор потока уникален и остается неизменным в течение его жизненного цикла. При завершении потока этот идентификатор может быть повторно использован.- Возвращает:
- Идентификатор этого потока.
- С тех пор как:
- 1.5
getState
public Thread.State getState()
- Возвращает:
- состояние этого потока.
- С тех пор как:
- 1.5
setDefaultUncaughtExceptionHandler
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Обработка необработанных исключений контролируется в первую очередь потоком, затем объектом ThreadGroup потока, и, наконец, обработчиком необработанных исключений по умолчанию. Если поток не имеет явного обработчика необработанных исключений, и группа потоков потока (включая родительские группы потоков) не специализирует свой метод uncaughtException, то метод обработчика по умолчанию uncaughtException будет вызван.
Установив обработчик необработанных исключений по умолчанию, приложение может изменить способ обработки необработанных исключений (например, регистрировать их в определенном устройстве или файле) для тех потоков, которые в противном случае использовали бы поведение по умолчанию, задаваемое системой.
Обратите внимание, что обработчик необработанных исключений по умолчанию обычно не должен обращаться к объекту группы потоков потока, так как это может привести к бесконечной рекурсии.
- Параметры:
-
eh- объект, используемый в качестве обработчика необработанных исключений по умолчанию. Еслиnull, то обработчика по умолчанию нет. - Исключения:
-
SecurityException- если присутствует менеджер безопасности, и он запрещаетRuntimePermission("setDefaultUncaughtExceptionHandler") - С тех пор как:
- 1.5
- См. также:
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
null, обработчик по умолчанию отсутствует.- Возвращает:
- обработчик неперехваченных исключений по умолчанию для всех потоков
- С:
- 1.5
- См. также:
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
ThreadGroup этого потока, если этот поток не завершил работу, в противном случае возвращается null. - Возвращает:
- обработчик неперехваченных исключений для этого потока
- С:
- 1.5
setUncaughtExceptionHandler
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Поток может полностью управлять тем, как он реагирует на неперехваченные исключения, установив свой обработчик неперехваченных исключений явно. Если такой обработчик не установлен, объект ThreadGroup потока действует как его обработчик.
- Параметры:
-
eh- объект, который будет использоваться в качестве обработчика неперехваченных исключений этого потока. Еслиnull, у этого потока нет явного обработчика. - Исключения:
-
SecurityException- если текущий поток не имеет разрешения на изменение этого потока. - С:
- 1.5
- См. также:
© 1993, 2021, 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/17/docs/api/java.base/java/lang/Thread.html