Класс Thread
- java.lang.Object
-
- java.lang.Thread
- Все реализованные интерфейсы:
- Runnable
- Непосредственные известные подклассы:
- ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Поток — это поток выполнения в программе. Java Virtual Machine позволяет приложению иметь несколько потоков выполнения, работающих одновременно.
Каждый поток имеет приоритет. Потоки с более высоким приоритетом выполняются в предпочтительном порядке перед потоками с более низким приоритетом. Каждый поток может быть или не быть помечен как демон. Когда код, выполняемый в некотором потоке, создаёт новый 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.
- С:
- JDK1.0
- См. также:
-
Runnable,Runtime.exit(int),run(),stop()
Вложенные классы
| Модификатор и тип | Класс и описание |
|---|---|
static class |
Thread.State Состояние потока. |
static interface |
Thread.UncaughtExceptionHandler Интерфейс для обработчиков, вызываемых, когда |
Поля
| Модификатор и тип | Поле и описание |
|---|---|
static int |
MAX_PRIORITY Максимальный приоритет, который может иметь поток. |
static int |
MIN_PRIORITY Минимальный приоритет, который может иметь поток. |
static int |
NORM_PRIORITY Приоритет по умолчанию, который назначается потоку. |
Конструкторы
| Конструктор и описание |
|---|
Thread() Выделяет новый объект |
Thread(Runnable target) Выделяет новый объект |
Thread(Runnable target,
String name) Выделяет новый объект |
Thread(String name) Выделяет новый объект |
Thread(ThreadGroup group,
Runnable target) Выделяет новый объект |
Thread(ThreadGroup group,
Runnable target,
String name) Выделяет новый объект |
Thread(ThreadGroup group,
Runnable target,
String name,
long stackSize) Выделяет новый объект |
Thread(ThreadGroup group,
String name) Выделяет новый объект |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
static int |
activeCount() Возвращает оценку количества активных потоков в группе потоков текущего потока и его подгруппах. |
void |
checkAccess() Определяет, имеет ли текущий запущенный поток разрешение на изменение этого потока. |
protected Object |
clone() Бросает CloneNotSupportedException, так как поток не может быть осмысленно клонирован. |
int |
countStackFrames() Устарело. Определение этого вызова зависит от |
static Thread |
currentThread() Возвращает ссылку на объект текущего выполняющегося потока. |
void |
destroy() Устарело. Этот метод изначально был разработан для уничтожения этого потока без какой-либо очистки. Любые мониторы, которые он удерживал, оставались бы заблокированными. Однако метод никогда не был реализован. Если бы он был реализован, он был бы подвержен тупику в той же мере, что и |
static void |
dumpStack() Выводит трассировку стека текущего потока в стандартный поток ошибок. |
static int |
enumerate(Thread[] tarray) Копирует в указанный массив каждый активный поток в группе потоков текущего потока и его подгруппах. |
static Map<Thread,StackTraceElement[]> |
getAllStackTraces() Возвращает карту трассировок стека для всех активных потоков. |
ClassLoader |
getContextClassLoader() Возвращает контекстный ClassLoader для этого потока. |
static Thread.UncaughtExceptionHandler |
getDefaultUncaughtExceptionHandler() Возвращает обработчик по умолчанию, вызываемый, когда поток внезапно завершается из-за необработанного исключения. |
long |
getId() Возвращает идентификатор этого потока. |
String |
getName() Возвращает имя этого потока. |
int |
getPriority() Возвращает приоритет этого потока. |
StackTraceElement[] |
getStackTrace() Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока. |
Thread.State |
getState() Возвращает состояние этого потока. |
ThreadGroup |
getThreadGroup() Возвращает группу потоков, к которой принадлежит этот поток. |
Thread.UncaughtExceptionHandler |
getUncaughtExceptionHandler() Возвращает обработчик, вызываемый, когда этот поток внезапно завершается из-за необработанного исключения. |
static boolean |
holdsLock(Object obj) Возвращает |
void |
interrupt() Прерывает этот поток. |
static boolean |
interrupted() Проверяет, был ли прерван текущий поток. |
boolean |
isAlive() Проверяет, жив ли этот поток. |
boolean |
isDaemon() Проверяет, является ли этот поток демоном. |
boolean |
isInterrupted() Проверяет, был ли прерван этот поток. |
void |
join() Ждёт завершения этого потока. |
void |
join(long millis) Ждёт не более |
void |
join(long millis,
int nanos) Ждёт не более |
void |
resume() Устарело. Этот метод существует только для использования с |
void |
run() Если этот поток был создан с использованием отдельного |
void |
setContextClassLoader(ClassLoader cl) Устанавливает контекстный ClassLoader для этого потока. |
void |
setDaemon(boolean on) Помечает этот поток как демонический поток или пользовательский поток. |
static void |
setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) Устанавливает обработчик по умолчанию, вызываемый, когда поток внезапно завершается из-за необработанного исключения, и для этого потока не определен никакой другой обработчик. |
void |
setName(String name) Изменяет имя этого потока на значение аргумента |
void |
setPriority(int newPriority) Изменяет приоритет этого потока. |
void |
setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) Устанавливает обработчик, вызываемый, когда этот поток внезапно завершается из-за необработанного исключения. |
static void |
sleep(long millis) Заставляет текущий выполняющийся поток спать (временно приостановить выполнение) на заданное количество миллисекунд, с учётом точности и надёжности системных таймеров и планировщиков. |
static void |
sleep(long millis,
int nanos) Заставляет текущий выполняющийся поток спать (временно приостановить выполнение) на заданное количество миллисекунд плюс заданное количество наносекунд, с учётом точности и надёжности системных таймеров и планировщиков. |
void |
start() Запускает выполнение этого потока; виртуальная машина Java вызывает метод |
void |
stop() Устарело. Этот метод по своей сути небезопасен. Остановка потока с помощью Thread.stop приводит к разблокировке всех мониторов, которые он заблокировал (как естественное следствие распространения необработанного исключения |
void |
stop(Throwable obj) Устарело. Этот метод изначально был разработан для принудительной остановки потока и выброса заданного |
void |
suspend() Устарело. Этот метод устарел, так как он по своей сути подвержен тупиковым ситуациям. Если целевой поток удерживает блокировку монитора, защищающую критический системный ресурс, когда он приостановлен, ни один поток не может получить доступ к этому ресурсу до тех пор, пока целевой поток не будет возобновлён. Если поток, который должен возобновить целевой поток, попытается заблокировать этот монитор до вызова |
String |
toString() Возвращает строковое представление этого потока, включая имя, приоритет и группу потоков. |
static void |
yield() Подсказка планировщику, что текущий поток готов уступить текущее использование процессора. |
Методы, унаследованные от класса java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Поля
MIN_PRIORITY
public static final int MIN_PRIORITY
Минимальный приоритет, который может иметь поток.
- См. также:
- Значения постоянных полей
NORM_PRIORITY
public static final int NORM_PRIORITY
По умолчанию приоритет, назначаемый потоку.
- См. также:
- Значения постоянных полей
MAX_PRIORITY
public static final int MAX_PRIORITY
Максимальный приоритет, который может иметь поток.
- См. также:
- Значения постоянных полей
Конструкторы
Thread
public Thread()
Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Thread (null, null, gname), где gname — это недавно сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.
Thread
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 с ThreadGroup в качестве аргумента.
Кроме того, вызывается его метод checkPermission с разрешением RuntimePermission("enableContextClassLoaderOverride") при вызове непосредственно или косвенно конструктором подкласса, который переопределяет методы getContextClassLoader или setContextClassLoader.
Приоритет вновь созданного потока устанавливается равным приоритету создающего его потока, то есть текущего работающего потока. Метод setPriority может быть использован для изменения приоритета на новое значение.
Новый созданный поток по умолчанию имеет статус daemon, если и только если создающий его поток также является daemon.
- Параметры:
-
group- группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target- объект, методrunкоторого вызывается, когда этот поток запущен. Еслиnull, вызывается метод run этого потока. -
name- имя нового потока - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков или не может переопределить методы контекстного загрузчика классов.
Thread
public Thread(ThreadGroup group,
Runnable target,
String name,
long stackSize) Выделяет новый объект Thread, у которого target в качестве объекта run, указанное name в качестве имени и принадлежит к группе потоков, указанной в group, и имеет указанный размер стека.
Этот конструктор идентичен Thread(ThreadGroup,Runnable,String) за исключением возможности указания размера стека потока. Размер стека — это приблизительное количество байтов адресного пространства, которое виртуальная машина должна выделить для стека этого потока. Эффект параметра stackSize, если таковой имеется, сильно зависит от платформы.
На некоторых платформах, указание большего значения параметра stackSize может позволить потоку достичь большей глубины рекурсии перед выбросом исключения StackOverflowError. Аналогично, указание меньшего значения может позволить большему количеству потоков существовать одновременно без выброса исключения OutOfMemoryError (или другой внутренней ошибки). Детали взаимосвязи между значением параметра stackSize и максимальной глубиной рекурсии и уровнем одновременности зависят от платформы. На некоторых платформах значение параметра stackSize может вообще не иметь никакого эффекта.
Виртуальная машина свободна обрабатывать параметр stackSize как подсказку. Если указанное значение слишком мало для платформы, виртуальная машина может использовать минимальное значение, специфичное для платформы; если указанное значение слишком велико, виртуальная машина может использовать максимальное значение, специфичное для платформы. Аналогично, виртуальная машина свободна округлять указанное значение вверх или вниз по своему усмотрению (или полностью его игнорировать).
Указание значения нуля для параметра stackSize заставит этот конструктор вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String).
Из-за зависимости от платформы поведения этого конструктора следует проявлять крайнюю осторожность при его использовании. Размер стека потока, необходимый для выполнения данного вычисления, вероятно, будет различаться между различными реализациями JRE. В свете этой вариации может потребоваться тщательная настройка параметра размера стека, и эта настройка может потребоваться повторить для каждой реализации JRE, на которой будет работать приложение.
Примечание по реализации: разработчики Java платформ рекомендуют документировать поведение своей реализации относительно параметра stackSize.
- Параметры:
-
group- группа потоков. Еслиnullи существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет илиSecurityManager.getThreadGroup()возвращаетnull, группа устанавливается в группу потоков текущего потока. -
target- объект, методrunкоторого вызывается, когда этот поток запущен. Еслиnull, вызывается метод run этого потока. -
name- имя нового потока -
stackSize- желаемый размер стека для нового потока, или ноль, чтобы указать, что этот параметр должен быть проигнорирован. - Исключения:
-
SecurityException- если текущий поток не может создать поток в указанной группе потоков - С:
- 1.4
Методы
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- дополнительные наносекунды ожидания - Исключения:
-
IllegalArgumentException- если значениеmillisотрицательно или значениеnanosне находится в диапазоне0-999999 -
InterruptedException- если какой-либо поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.
clone
protected Object clone()
throws CloneNotSupportedException Выбрасывает CloneNotSupportedException, так как поток не может быть клонирован осмысленно. Создайте новый поток вместо этого.
- Переопределяет:
-
cloneв классеObject - Возвращает:
- клонированную копию этого экземпляра.
- Исключения:
-
CloneNotSupportedException- всегда - См. также:
Cloneable
start
public void start()
Запускает выполнение этого потока; виртуальная машина Java вызывает метод run этого потока.
В результате выполняются два потока одновременно: текущий поток (который возвращается из вызова метода start) и другой поток (который выполняет свой метод run).
Неправомерно запускать поток более одного раза. В частности, поток не может быть запущен повторно после завершения выполнения.
- Исключения:
-
IllegalThreadStateException- если поток уже был запущен. - См. также:
-
run(),stop()
run
public void run()
Если этот поток был создан с помощью отдельного объекта Runnable run, то метод Runnable этого объекта run вызывается; в противном случае этот метод ничего не делает и возвращается.
Подклассы Thread должны переопределять этот метод.
- Указано в:
-
runв интерфейсеRunnable - См. также:
-
start(),stop(),Thread(ThreadGroup, Runnable, String)
stop
@Deprecated public final void stop()
Устаревший. Этот метод по своей природе небезопасен. Остановка потока с помощью Thread.stop приводит к разблокировке всех мониторов, которые он заблокировал (как естественное следствие распространения исключения ThreadDeath вверх по стеку). Если какие-либо объекты, ранее защищённые этими мониторами, находились в несогласованном состоянии, повреждённые объекты станут видимыми для других потоков, что может привести к произвольному поведению. Многие случаи использования stop следует заменить кодом, который просто изменяет некоторую переменную, чтобы указать целевому потоку, что он должен остановиться. Целевой поток должен регулярно проверять эту переменную и возвращаться из своего метода run упорядоченно, если переменная указывает на то, что он должен остановиться. Если целевой поток ожидает в течение длительного времени (например, на переменной состояния), следует использовать метод interrupt для прерывания ожидания. Более подробную информацию см. на Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
Принудительно останавливает выполнение потока.
Если установлен менеджер безопасности, его метод checkAccess вызывается с this в качестве аргумента. Это может привести к возникновению SecurityException (в текущем потоке).
Если этот поток отличается от текущего потока (то есть текущий поток пытается остановить другой поток, а не себя), метод менеджера безопасности checkPermission (с аргументом RuntimePermission("stopThread")) вызывается дополнительно. Опять же, это может привести к выбросу SecurityException (в текущем потоке).
Поток, представленный этим потоком, принудительно останавливается, что бы он ни делал, и выбросит новый созданный объект ThreadDeath в качестве исключения.
Разрешается останавливать поток, который ещё не запущен. Если поток в конечном итоге будет запущен, он немедленно завершится.
Приложение обычно не должно пытаться перехватить ThreadDeath , если только оно не должно выполнить какие-то чрезвычайные операции по очистке (обратите внимание, что выброс ThreadDeath вызывает выполнение finally блоков try операторов перед официальной смертью потока). Если блок catch перехватывает объект ThreadDeath, важно повторно выбросить объект, чтобы поток действительно умер.
Обработчик ошибок верхнего уровня, реагирующий на исключения, которые иначе не были перехвачены, не выводит сообщение или иным образом не уведомляет приложение, если неперехваченное исключение является экземпляром ThreadDeath.
- Исключения:
-
SecurityException- если текущий поток не может изменить этот поток. - См. также:
-
interrupt(),checkAccess(),run(),start(),ThreadDeath,ThreadGroup.uncaughtException(Thread,Throwable),SecurityManager.checkAccess(Thread),SecurityManager.checkPermission(java.security.Permission)
stop
@Deprecated public final void stop(Throwable obj)
Устаревший. Этот метод изначально был разработан для принудительной остановки потока и выброса заданного исключения Throwable. Он был по своей природе небезопасен (см. stop() для подробностей), а кроме того, мог использоваться для генерации исключений, с которыми целевой поток не был готов работать. Более подробную информацию см. на Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
Выбрасывает UnsupportedOperationException.
- Параметры:
-
obj- игнорируется
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 селектора.
Если ни одно из предыдущих условий не выполняется, то статус прерывания этого потока будет установлен.
Прерывание потока, который не жив, может не иметь никакого эффекта.
- Исключения:
-
SecurityException- если текущий поток не может изменить этот поток
interrupted
public static boolean interrupted()
Проверяет, был ли текущий поток прерван. Статус прерывания потока сбрасывается этим методом. Другими словами, если этот метод был бы вызван дважды подряд, второй вызов вернул бы false (если бы текущий поток не был прерван снова после того, как первый вызов сбросил его статус прерывания и до того, как второй вызов его проверил).
Прерывание потока, проигнорированное из-за того, что поток не был жив во время прерывания, отразится на возврате этого метода false.
- Возвращает:
-
trueесли текущий поток был прерван;falseв противном случае. - См. также:
isInterrupted()
isInterrupted
public boolean isInterrupted()
Проверяет, была ли прервана эта нить. Статус прерывания нити этим методом не затрагивается.
Прерывание нити, проигнорированное, поскольку нить не была активна в момент прерывания, будет отражено возвратом этого метода false.
- Возвращает:
-
trueесли эта нить была прервана;falseв противном случае. - См. также:
interrupted()
destroy
@Deprecated public void destroy()
Устаревший. Этот метод изначально был разработан для уничтожения этой нити без каких-либо действий по очистке. Любые мониторы, которые она удерживала, оставались бы заблокированными. Однако метод никогда не был реализован. Если бы он был реализован, он бы подвергался тупику, аналогично suspend(). Если целевая нить удерживала блокировку, защищающую критический системный ресурс, при ее уничтожении, ни одна нить больше не могла получить доступ к этому ресурсу. Если другая нить попыталась бы заблокировать этот ресурс, возник бы тупик. Такие тупики обычно проявляются как «замороженные» процессы. Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели?.
Бросает NoSuchMethodError.
- Бросает:
-
NoSuchMethodError— всегда
isAlive
public final boolean isAlive()
Проверяет, активна ли эта нить. Нит считаем активной, если она была запущена и еще не завершилась.
- Возвращает:
-
trueесли эта нить активна;falseв противном случае.
suspend
@Deprecated public final void suspend()
Устаревший. Этот метод устарел, поскольку он сам по себе подвержен тупиковой ситуации. Если целевая нить удерживает блокировку монитора, защищающего критический системный ресурс, когда она приостановлена, ни одна нить не может получить доступ к ресурсу до тех пор, пока целевая нить не будет возобновлена. Если нить, которая должна возобновить целевую нить, попытается заблокировать этот монитор до вызова resume, возникает тупиковая ситуация. Такие тупики обычно проявляются как «замороженные» процессы. Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели?.
Приостанавливает эту нить.
Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к сбросу SecurityException (в текущей нити).
Если нить активна, она приостанавливается и не делает дальнейших шагов, пока не будет возобновлена.
- Бросает:
-
SecurityException— если текущая нить не может изменить эту нить. - См. также:
checkAccess()
resume
@Deprecated public final void resume()
Устаревший. Этот метод существует только для использования с suspend(), который устарел, поскольку подвержен тупиковой ситуации. Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели?.
Возобновляет приостановленную нить.
Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к сбросу SecurityException (в текущей нити).
Если нить активна, но приостановлена, она возобновляется и ей разрешается выполнять действия.
- Бросает:
-
SecurityException— если текущая нить не может изменить эту нить. - См. также:
-
checkAccess(),suspend()
setPriority
public final void setPriority(int newPriority)
Изменяет приоритет этой нити.
Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к сбросу SecurityException.
В противном случае приоритет этой нити устанавливается как меньшее из заданного newPriority и максимального допустимого приоритета группы нитей нити.
- Параметры:
-
newPriority- приоритет, который нужно установить для этой нити - Бросает:
-
IllegalArgumentException- если приоритет не находится в диапазонеMIN_PRIORITYдоMAX_PRIORITY. -
SecurityException- если текущая нить не может изменить эту нить. - См. также:
-
getPriority(),checkAccess(),getThreadGroup(),MAX_PRIORITY,MIN_PRIORITY,ThreadGroup.getMaxPriority()
getPriority
public final int getPriority()
Возвращает приоритет этой нити.
- Возвращает:
- приоритет этой нити.
- См. также:
setPriority(int)
setName
public final void setName(String name)
Изменяет имя этой нити на значение аргумента name.
Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к сбросу SecurityException.
- Параметры:
-
name- новое имя этой нити. - Бросает:
-
SecurityException- если текущая нить не может изменить эту нить. - См. также:
-
getName(),checkAccess()
getName
public final String getName()
Возвращает имя этой нити.
- Возвращает:
- имя этой нити.
- См. также:
setName(String)
getThreadGroup
public final ThreadGroup getThreadGroup()
Возвращает группу нитей, к которой принадлежит эта нить. Этот метод возвращает 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 public int countStackFrames()
Устаревший. Определение этого вызова зависит от suspend(), который устарел. Кроме того, результаты этого вызова никогда не были четко определены.
Подсчитывает количество кадров стека в этой нити. Нит должна быть приостановлена.
- Возвращает:
- количество кадров стека в этой нити.
- Бросает:
-
IllegalThreadStateException- если эта нить не приостановлена.
join
public final void join(long millis)
throws InterruptedException Ожидает не более millis миллисекунд, пока эта нить не завершит свою работу. Значение таймаута 0 означает ожидание бесконечно.
Эта реализация использует цикл вызовов 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 наносекунд, пока эта нить не завершит свою работу.
Эта реализация использует цикл вызовов 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- если какой-либо поток прервал текущий поток. Состояние прерывания текущего потока очищается при возникновении этого исключения.
dumpStack
public static void dumpStack()
Выводит трассировку стека текущего потока в стандартный поток ошибок. Этот метод используется только для отладки.
- См. также:
Throwable.printStackTrace()
setDaemon
public final void setDaemon(boolean on)
Отмечает этот поток как демон-поток или пользовательский поток. Виртуальная машина Java завершается, когда единственными работающими потоками являются все демон-потоки.
Этот метод должен быть вызван до запуска потока.
- Параметры:
-
on- еслиtrue, отмечает этот поток как демон-поток - Исключения:
-
IllegalThreadStateException- если этот поток активен -
SecurityException- еслиcheckAccess()определяет, что текущий поток не может изменить этот поток
isDaemon
public final boolean isDaemon()
Проверяет, является ли этот поток демон-потоком.
- Возвращает:
-
trueесли этот поток является демон-потоком;falseв противном случае. - См. также:
setDaemon(boolean)
checkAccess
public final void checkAccess()
Определяет, имеет ли текущий поток разрешение на изменение этого потока.
Если существует менеджер безопасности, его метод checkAccess вызывается с этим потоком в качестве аргумента. Это может привести к выбросу исключения SecurityException.
- Исключения:
-
SecurityException- если текущему потоку запрещен доступ к этому потоку. - См. также:
SecurityManager.checkAccess(Thread)
toString
public String toString()
Возвращает строковое представление этого потока, включая имя потока, приоритет и группу потоков.
getContextClassLoader
public ClassLoader getContextClassLoader()
Возвращает контекстный загрузчик классов для этого потока. Контекстный загрузчик классов предоставляется создателем потока для использования кодом, работающим в этом потоке, при загрузке классов и ресурсов. Если не установлен, по умолчанию используется контекстный загрузчик родительского потока. Контекстный загрузчик первоначального потока обычно устанавливается в загрузчик классов, используемый для загрузки приложения.
Если менеджер безопасности присутствует, и загрузчик класса вызывающего не null и не совпадает с контекстным загрузчиком классов или не является его предком, то этот метод вызывает метод менеджера безопасности checkPermission с разрешением RuntimePermission("getClassLoader") для проверки того, разрешен ли запрос контекстного загрузчика классов.
- Возвращает:
- контекстный загрузчик классов для этого потока или
null, указывающий на системный загрузчик классов (или, в крайнем случае, загрузчик базовых классов) - Исключения:
-
SecurityException- если текущий поток не может получить контекстный загрузчик классов - С:
- 1.2
setContextClassLoader
public void setContextClassLoader(ClassLoader cl)
Устанавливает контекстный загрузчик классов для этого потока. Контекстный загрузчик классов может быть установлен при создании потока, и позволяет создателю потока предоставить соответствующий загрузчик классов, через getContextClassLoader, коду, работающему в потоке, при загрузке классов и ресурсов.
Если менеджер безопасности присутствует, вызывается его метод checkPermission с разрешением RuntimePermission("setContextClassLoader") для проверки разрешения на установку контекстного загрузчика классов.
- Параметры:
-
cl- контекстный загрузчик классов для этого потока, или null, указывающий на системный загрузчик классов (или, в крайнем случае, загрузчик базовых классов) - Исключения:
-
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
- См. также:
-
SecurityManager.checkPermission(java.security.Permission),RuntimePermission,Throwable.getStackTrace()
getAllStackTraces
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
Возвращает карту трассировок стека для всех активных потоков. Ключами карты являются потоки, а каждое значение карты — массив StackTraceElement , представляющий дамп стека соответствующего Thread. Возвращаемые трассировки стека имеют формат, указанный для метода getStackTrace.
Потоки могут выполняться во время вызова этого метода. Трассировка стека каждого потока представляет собой только снимок, и каждая трассировка стека может быть получена в разное время. Нулевой массив будет возвращен в значении карты, если виртуальная машина не имеет информации о трассировке стека для потока.
Если есть менеджер безопасности, вызывается метод менеджера безопасности checkPermission с разрешением RuntimePermission("getStackTrace") а также RuntimePermission("modifyThreadGroup") для проверки разрешения на получение трассировки стека всех потоков.
- Возвращает:
- мапу от
Mapдо массиваStackTraceElement, представляющего трассировку стека соответствующего потока. - Исключения:
-
SecurityException- если существует менеджер безопасности и его методcheckPermissionне позволяет получить трассировку стека потока. - С:
- 1.5
- См. также:
-
getStackTrace(),SecurityManager.checkPermission(java.security.Permission),RuntimePermission,Throwable.getStackTrace()
getId
public long getId()
Возвращает идентификатор этого потока. Идентификатор потока — положительное long число, сгенерированное при создании этого потока. Идентификатор потока уникален и остается неизменным в течение его жизненного цикла. При завершении потока этот идентификатор может быть повторно использован.
- Возвращает:
- идентификатор этого потока.
- С:
- 1.5
getState
public Thread.State getState()
Возвращает состояние этого потока. Этот метод предназначен для использования при мониторинге состояния системы, а не для управления синхронизацией.
- Возвращает:
- состояние этого потока.
- С:
- 1.5
setDefaultUncaughtExceptionHandler
public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Устанавливает обработчик по умолчанию, который вызывается, когда поток внезапно завершается из-за необработанного исключения и ни один другой обработчик не был определен для этого потока.
Обработка необработанных исключений контролируется в первую очередь потоком, затем объектом ThreadGroup потока, и, наконец, обработчиком необработанных исключений по умолчанию. Если у потока не установлен явный обработчик необработанных исключений, и группа потоков потока (включая родительские группы потоков) не специализирует свой метод uncaughtException, тогда вызывается метод обработчика необработанных исключений по умолчанию.
Установив обработчик необработанных исключений по умолчанию, приложение может изменить способ обработки необработанных исключений (например, ведение журнала в определённое устройство или файл) для тех потоков, которые уже принимали бы какое-либо «стандартное» поведение системы.
Обратите внимание, что обработчик необработанных исключений по умолчанию обычно не должен пересылать запрос к объекту ThreadGroup потока, так как это может вызвать бесконечную рекурсию.
- Параметры:
-
eh- объект, используемый в качестве обработчика необработанных исключений по умолчанию. Еслиnull, то обработчик по умолчанию отсутствует. - Исключения:
-
SecurityException- если менеджер безопасности присутствует и он отказываетсяRuntimePermission("setDefaultUncaughtExceptionHandler") - С:
- 1.5
- См. также:
-
setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler),getUncaughtExceptionHandler(),ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
getDefaultUncaughtExceptionHandler
public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
Возвращает обработчик по умолчанию, вызываемый при внезапном завершении потока из-за необработанного исключения. Если возвращаемое значение равно null, обработчика по умолчанию нет.
- Возвращает:
- обработчик необработанных исключений по умолчанию для всех потоков
- С момента:
- 1.5
- См. также:
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)
getUncaughtExceptionHandler
public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
Возвращает обработчик, вызываемый при внезапном завершении этого потока из-за необработанного исключения. Если для этого потока не был явно задан обработчик необработанных исключений, то возвращается объект ThreadGroup этого потока, если только этот поток не завершен, в этом случае возвращается null.
- Возвращает:
- обработчик необработанных исключений для этого потока
- С момента:
- 1.5
setUncaughtExceptionHandler
public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Устанавливает обработчик, вызываемый при внезапном завершении этого потока из-за необработанного исключения.
Поток может полностью контролировать реакцию на необработанные исключения, явно задав свой обработчик необработанных исключений. Если такой обработчик не задан, объект ThreadGroup потока действует как его обработчик.
- Параметры:
-
eh— объект, используемый в качестве обработчика необработанных исключений этого потока. Еслиnull, то у этого потока нет явного обработчика. - Исключения:
-
SecurityException— если текущий поток не имеет права изменять этот поток. - С момента:
- 1.5
- См. также:
-
setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler),ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable)
© 1993, 2020, 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.