Spec-Zone.ru › OpenJDK 17

Класс 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.

С момента:
1.0
См. также:
  • Runnable
  • Runtime.exit(int)
  • run()
  • stop()

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static enum  Thread.State
Состояние потока.
static interface  Thread.UncaughtExceptionHandler
Интерфейс для обработчиков, вызываемых, когда поток Thread неожиданно завершается из-за необработанного исключения.

Краткое описание полей

Модификатор и тип Поле Описание
static final int MAX_PRIORITY
Максимальный приоритет, который может иметь поток.
static final int MIN_PRIORITY
Минимальный приоритет, который может иметь поток.
static final int NORM_PRIORITY
Приоритет по умолчанию, который назначается потоку.

Краткое описание конструкторов

Конструктор Описание
Thread()
Выделяет новый объект Thread.
Thread(Runnable target)
Выделяет новый объект Thread.
Thread(Runnable target, String name)
Выделяет новый объект Thread.
Thread(String name)
Выделяет новый объект Thread.
Thread(ThreadGroup group, Runnable target)
Выделяет новый объект Thread.
Thread(ThreadGroup group, Runnable target, String name)
Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени и принадлежит группе потоков, указанной group.
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени и принадлежит группе потоков, указанной group, и имеет указанный размер стека.
Thread(ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals)
Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени, принадлежит группе потоков, указанной group, имеет указанный stackSize, и наследует начальные значения для переменных inheritable thread-local, если inheritThreadLocals является true.
Thread(ThreadGroup group, String name)
Выделяет новый объект Thread.

Краткое описание методов

Модификатор и тип Метод Описание
static int activeCount()
Возвращает оценку количества активных потоков в группе потоков текущего потока и его подгруппах.
final void checkAccess()
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Этот метод полезен только в сочетании с менеджером безопасности, который устарел и может быть удалён в будущей версии.
protected Object clone()
Бросает CloneNotSupportedException, так как поток не может быть осмысленно клонирован.
int countStackFrames()
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Этот метод изначально был разработан для подсчёта числа кадров стека, но результаты никогда не были чётко определены и зависели от приостановки потока.
static Thread currentThread()
Возвращает ссылку на объект текущего выполняющегося потока.
static void dumpStack()
Выводит трассировку стека текущего потока в стандартный поток ошибок.
static int enumerate(Thread[] tarray)
Копирует в указанный массив каждый активный поток в группе потоков текущего потока и его подгруппах.
static Map<Thread,StackTraceElement[]> 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(Object obj)
Возвращает true, если и только если текущий поток удерживает блокировку монитора на указанном объекте.
void interrupt()
Прерывает этот поток.
static boolean interrupted()
Проверяет, был ли прерван текущий поток.
final boolean isAlive()
Проверяет, жив ли этот поток.
final boolean isDaemon()
Проверяет, является ли этот поток демоническим потоком.
boolean isInterrupted()
Проверяет, был ли прерван этот поток.
final void join()
Ожидает завершения этого потока.
final void join(long millis)
Ожидает не более millis миллисекунд завершения этого потока.
final void join(long millis, int nanos)
Ожидает не более millis миллисекунд плюс nanos наносекунд завершения этого потока.
static void onSpinWait()
Указывает, что вызывающая сторона временно не может продолжить работу, до тех пор, пока не произойдут одно или несколько действий со стороны других задач.
final void resume()
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Этот метод существует только для использования с suspend(), который устарел, так как он подвержен тупиковым ситуациям.
void run()
Если этот поток был создан с использованием отдельного объекта Runnable run, то метод Runnable этого объекта run вызывается; в противном случае этот метод ничего не делает и возвращает.
void setContextClassLoader(ClassLoader cl)
Устанавливает загрузчик классов контекста для этого потока.
final void setDaemon(boolean on)
Помечает этот поток как демонический поток или поток пользователя.
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Устанавливает обработчик по умолчанию, вызываемый, когда поток неожиданно завершается из-за необработанного исключения, и для этого потока не был определён другой обработчик.
final void setName(String name)
Изменяет имя этого потока на равное аргументу name.
final void setPriority(int newPriority)
Изменяет приоритет этого потока.
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)
Устанавливает обработчик, вызываемый, когда этот поток неожиданно завершается из-за необработанного исключения.
static void sleep(long millis)
Принуждает текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное количество миллисекунд, с учётом точности и надёжности системных таймеров и планировщиков.
static void sleep(long millis, int nanos)
Принуждает текущий выполняющийся поток заснуть (временно прекратить выполнение) на указанное количество миллисекунд плюс указанное количество наносекунд, с учётом точности и надёжности системных таймеров и планировщиков.
void start()
Запускает этот поток; виртуальная машина Java вызывает метод run этого потока.
final void stop()
Устаревшее.
Этот метод потенциально небезопасен.
final void suspend()
Устаревшее, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Этот метод устарел, так как он потенциально может привести к тупиковой ситуации.
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 с группой потоков в качестве аргумента.

Кроме того, его метод 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
Выбрасывает CloneNotSupportedException, так как поток не может быть осмысленно клонирован. Создайте новый поток вместо этого.
Overrides:
clone в классе Object
Returns:
клонированная копия этого экземпляра.
Throws:
CloneNotSupportedException - всегда
See Also:
  • Cloneable
END_OF_DOCUMENT_MARKER

start

public void start()
Заставляет данную нить начать выполнение; виртуальная машина Java вызывает метод run этой нити.

В результате будут выполняться две нити одновременно: текущая нить (которая возвращается из вызова метода start) и другая нить (которая выполняет свой метод run).

Запускать нить более одного раза недопустимо. В частности, нить нельзя перезапустить после завершения выполнения.

Throws:
IllegalThreadStateException - если нить уже была запущена.
See Also:
  • run()
  • stop()

run

public void run()
Если эта нить была создана с использованием отдельного объекта Runnable run, то вызывается метод Runnable этого объекта run; в противном случае этот метод ничего не делает и возвращает значение.

Подклассы Thread должны переопределять этот метод.

Specified by:
run в интерфейсе Runnable
See Also:
  • start()
  • stop()
  • Thread(ThreadGroup, Runnable, String)

stop

@Deprecated(since="1.2") public final void stop()
Deprecated.
Этот метод по своей сути небезопасен. Остановка нити с помощью Thread.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()
  • checkAccess()
  • run()
  • start()
  • ThreadDeath
  • ThreadGroup.uncaughtException(Thread,Throwable)
  • SecurityManager.checkAccess(Thread)
  • SecurityManager.checkPermission(java.security.Permission)

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()
Проверяет, была ли прервана текущая нить. Статус прерывания нити сбрасывается этим методом. Другими словами, если этот метод был вызван дважды подряд, второй вызов вернёт false (если текущая нить не была прервана повторно после того, как первый вызов сбросил её статус прерывания и до того, как второй вызов проверил его).
Returns:
true если текущая нить была прервана; false в противном случае.
See Also:
  • isInterrupted()

isInterrupted

public boolean isInterrupted()
Проверяет, была ли прервана эта нить. Статус прерывания нити не изменяется этим методом.
Returns:
true если эта нить была прервана; false в противном случае.
See Also:
  • interrupted()

isAlive

public final boolean isAlive()
Проверяет, активна ли эта нить. Нить активна, если она была запущена и ещё не умерла.
Returns:
true если эта нить активна; false в противном случае.

suspend

@Deprecated(since="1.2", forRemoval=true) public final void suspend()
Deprecated, for removal: This API element is subject to removal in a future version.
Этот метод устарел, так как он по своей сути приводит к тупиковой ситуации. Если целевая нить удерживает блокировку монитора, защищающего критический системный ресурс, когда она приостанавливается, ни одна нить не может получить доступ к этому ресурсу до тех пор, пока целевая нить не будет возобновлена. Если нить, которая должна возобновить целевую нить, пытается заблокировать этот монитор до вызова resume, возникает тупиковая ситуация. Такие тупиковые ситуации обычно проявляются как «зависшие» процессы. Более подробную информацию см. на странице Почему Thread.stop, Thread.suspend и Thread.resume устарели?.
Приостанавливает выполнение этой нити.

Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к возбуждению SecurityException (в текущей нити).

Если нить активна, она приостанавливается и не делает дальнейшего прогресса, пока не будет возобновлена.

Throws:
SecurityException - если текущая нить не может изменить эту нить.
See Also:
  • checkAccess()

resume

@Deprecated(since="1.2", forRemoval=true) public final void resume()
Устаревшее, подлежит удалению: Этот элемент API может быть удалён в будущей версии.
Этот метод существует только для использования с suspend(), который устарел, так как может привести к тупику. Дополнительную информацию можно найти в Почему Thread.stop, Thread.suspend и Thread.resume устарели?.
Возобновляет приостановленную нить.

Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к исключению SecurityException (в текущей нити).

Если нить активна, но приостановлена, она возобновляется и ей разрешается продолжить выполнение.

Throws:
SecurityException - если текущая нить не может изменить эту нить.
См. также:
  • checkAccess()
  • suspend()

setPriority

public final void setPriority(int newPriority)
Изменяет приоритет этой нити.

Сначала вызывается метод checkAccess этой нити без аргументов. Это может привести к исключению SecurityException.

В противном случае приоритет этой нити устанавливается как меньшее из указанного newPriority и максимального разрешенного приоритета группы нитей этой нити.

Параметры:
newPriority - приоритет, который нужно установить для этой нити
Throws:
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 - новое имя для этой нити.
Throws:
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 - массив, в который следует поместить список нитей
Возвращает:
количество нитей, помещённых в массив
Throws:
SecurityException - если ThreadGroup.checkAccess() определяет, что текущая нить не имеет доступа к своей группе нитей

countStackFrames

@Deprecated(since="1.2", forRemoval=true) public int countStackFrames()
Устаревшее, подлежит удалению: Этот элемент API может быть удалён в будущей версии.
Этот метод изначально был разработан для подсчёта количества кадров стека, но результаты никогда не были чётко определены, и зависели от приостановки нитей. Этот метод может быть удалён в будущей версии Java SE.
Выбрасывает UnsupportedOperationException.
Возвращает:
ничего
См. также:
  • StackWalker

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)
Помечает эту нить как демоническую или пользовательскую. Java Virtual Machine завершает свою работу, когда все работающие нити являются демоническими.

Этот метод должен быть вызван до запуска нити.

Параметры:
on - если true, помечает эту нить как демоническую
Throws:
IllegalThreadStateException - если эта нить активна
SecurityException - если checkAccess() определяет, что текущая нить не может изменить эту нить

isDaemon

public final boolean isDaemon()
Проверяет, является ли эта нить демонической.
Возвращает:
true если эта нить является демонической; false в противном случае.
См. также:
  • setDaemon(boolean)

checkAccess

@Deprecated(since="17", forRemoval=true) public final void checkAccess()
Устарело, подлежит удалению: Этот элемент API может быть удален в будущей версии.
Этот метод полезен только в сочетании с менеджером безопасности, который устарел и подлежит удалению в будущей версии выпуска. Соответственно, этот метод также устарел и подлежит удалению. Замены для менеджера безопасности или этого метода нет.
Определяет, имеет ли текущий поток разрешение на изменение этого потока.

Если существует менеджер безопасности, его метод checkAccess вызывается с этим потоком в качестве аргумента. Это может привести к выбросу SecurityException.

Исключения:
SecurityException - если текущий поток не имеет разрешения на доступ к этому потоку.
См. также:
  • SecurityManager.checkAccess(Thread)

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
См. также:
  • SecurityManager.checkPermission(java.security.Permission)
  • RuntimePermission
  • Throwable.getStackTrace()

getAllStackTraces

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

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

Если существует менеджер безопасности, то метод менеджера безопасности checkPermission вызывается с разрешением RuntimePermission("getStackTrace") а также разрешением RuntimePermission("modifyThreadGroup") для проверки, можно ли получить дамп стека всех потоков.

Возвращает:
карту Map от Thread до массива 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, то метод обработчика по умолчанию uncaughtException будет вызван.

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

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

Параметры:
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, 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

Spec-Zone.ru

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