Класс Thread

Все реализованные интерфейсы:
Runnable
Непосредственные известные подклассы:
ForkJoinWorkerThread
public class Thread
extends Object
implements Runnable

Поток — это поток выполнения в программе. Виртуальная машина Java позволяет приложению иметь несколько потоков выполнения, работающих одновременно.

Каждый поток имеет приоритет. Потоки с более высоким приоритетом выполняются в предпочтительном порядке по сравнению с потоками с более низким приоритетом. Каждый поток может или не может быть помечен как демо-поток. Когда код, выполняющийся в каком-то потоке, создает новый Thread объект, приоритет нового потока изначально устанавливается равным приоритету создающего потока, а новый поток является демо-потоком тогда и только тогда, когда создающий поток является демо-потоком.

При запуске виртуальной машины Java обычно существует один не-демо-поток (который обычно вызывает метод с именем main некоторого назначенного класса). Виртуальная машина продолжает выполнять потоки до тех пор, пока не произойдёт одно из следующих событий:

  • Метод 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 class  Thread.State

Состояние потока.

static interface  Thread.UncaughtExceptionHandler

Интерфейс для обработчиков, вызываемых, когда Thread прерывается из-за необработанного исключения.

Поля

Модификатор и тип Поле Описание
static int MAX_PRIORITY

Максимальный приоритет потока.

static int MIN_PRIORITY

Минимальный приоритет потока.

static 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, имя было заданным name, а группа потоков, к которой он принадлежит, обозначалась group.

Thread​(ThreadGroup group, Runnable target, String name, long stackSize)

Выделяет новый объект Thread так, чтобы его объектом выполнения был target, имя было заданным name, а группа потоков, к которой он принадлежит, обозначалась group, и задан размер стека.

Thread​(ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals)

Выделяет новый объект Thread так, чтобы его объектом выполнения был target, имя было заданным name, он принадлежал группе потоков, обозначенной group, задан stackSize, и наследовались начальные значения для переменных наследуемых потоковых локалей, если inheritThreadLocals равен true.

Thread​(ThreadGroup group, String name)

Выделяет новый объект Thread.

Методы

Модификатор и тип Метод Описание
static int activeCount()

Возвращает оценку количества активных потоков в группе потоков текущего потока и его подгруппах.

void checkAccess()

Определяет, имеет ли текущий запущенный поток разрешение на изменение этого потока.

protected Object clone()

Бросает CloneNotSupportedException, так как поток не может быть осмысленно клонирован.

int countStackFrames()

Устаревшее, для удаления: Этот элемент API может быть удален в будущей версии.

Определение этого вызова зависит от suspend(), который устарел.

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()

Возвращает идентификатор этого потока.

String getName()

Возвращает имя этого потока.

int getPriority()

Возвращает приоритет этого потока.

StackTraceElement[] getStackTrace()

Возвращает массив элементов стека, представляющих дамп стека этого потока.

Thread.State getState()

Возвращает состояние этого потока.

ThreadGroup getThreadGroup()

Возвращает группу потоков, к которой принадлежит этот поток.

Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()

Возвращает обработчик, вызываемый при внезапном завершении этого потока из-за необработанного исключения.

static boolean holdsLock​(Object obj)

Возвращает true, если и только если текущий поток удерживает блокировку монитора на указанном объекте.

void interrupt()

Прерывает этот поток.

static boolean interrupted()

Проверяет, был ли прерван текущий поток.

boolean isAlive()

Проверяет, жив ли этот поток.

boolean isDaemon()

Проверяет, является ли этот поток демоном.

boolean isInterrupted()

Проверяет, был ли прерван этот поток.

void join()

Ожидает завершения этого потока.

void join​(long millis)

Ожидает завершения этого потока не более чем millis миллисекунд.

void join​(long millis, int nanos)

Ожидает завершения этого потока не более чем millis миллисекунд плюс nanos наносекунд.

static void onSpinWait()

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

void resume()

Устаревший.

Этот метод существует только для использования с suspend(), который устарел, потому что он подвержен тупиковым ситуациям.

void run()

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

void setContextClassLoader​(ClassLoader cl)

Устанавливает ClassLoader контекста для этого потока.

void setDaemon​(boolean on)

Помечает этот поток как static void поток или пользовательский поток.

static void setDefaultUncaughtExceptionHandler​(Thread.UncaughtExceptionHandler eh)

Установите обработчик по умолчанию, вызываемый при внезапном завершении потока из-за необработанного исключения, и для этого потока не определен никакой другой обработчик.

void setName​(String name)

Изменяет имя этого потока, чтобы оно было равно аргументу 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 вызывает run метод этого потока.

void stop()

Устаревший.

Этот метод по своей природе небезопасен.

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

Максимальный приоритет потока.

См. также:
Значения константных полей

Конструкторы

Поток

public Thread()

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (null, null, gname), где gname — это новое сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Поток

public Thread(Runnable target)

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (null, target, gname), где gname — это новое сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Параметры:
target - объект, метод run которого вызывается при запуске этого потока. Если null, метод run этого класса ничего не делает.

Поток

public Thread(ThreadGroup group,
              Runnable target)

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (group, target, gname) , где gname — это новое сгенерированное имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Параметры:
group - группа потоков. Если null и существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет или SecurityManager.getThreadGroup() возвращает null, группа устанавливается в группу потоков текущего потока.
target - объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
Исключения:
SecurityException - если текущий поток не может создать поток в указанной группе потоков

Поток

public Thread(String name)

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (null, null, name).

Параметры:
name - имя нового потока

Поток

public Thread(ThreadGroup group,
              String name)

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (group, null, name).

Параметры:
group - группа потоков. Если null и существует менеджер безопасности, группа определяется методом SecurityManager.getThreadGroup(). Если менеджера безопасности нет или SecurityManager.getThreadGroup() возвращает null, группа устанавливается в группу потоков текущего потока.
name - имя нового потока
Исключения:
SecurityException - если текущий поток не может создать поток в указанной группе потоков

Поток

public Thread(Runnable target,
              String name)

Выделяет новый объект Thread. Этот конструктор имеет тот же эффект, что и Поток (null, target, name).

Параметры:
target - объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name - имя нового потока

Поток

public Thread(ThreadGroup group,
              Runnable target,
              String name)

Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени и принадлежит к группе потоков, на которую ссылается group.

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

Кроме того, при непосредственном или косвенном вызове конструктора подкласса, который переопределяет методы checkPermission или setContextClassLoader, вызывается его метод RuntimePermission("enableContextClassLoaderOverride") с разрешением getContextClassLoader.

Приоритет нового потока устанавливается равным приоритету создающего его потока, то есть текущему выполняемому потоку. Метод 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 в качестве объекта 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

Поток

public Thread(ThreadGroup group,
              Runnable target,
              String name,
              long stackSize,
              boolean inheritThreadLocals)

Выделяет новый объект Thread, так что у него target в качестве объекта run, указанное name в качестве имени, он принадлежит к группе потоков, на которую ссылается group, имеет заданный stackSize, и наследует начальные значения для передаваемых по наследству локальных переменных, если inheritThreadLocals равно true.

Этот конструктор идентичен Thread(ThreadGroup,Runnable,String,long) с добавлением возможности подавления или нет наследования начальных значений для передаваемых по наследству локальных переменных от создающего поток. Это позволяет более тонко управлять передаваемыми по наследству локальными переменными. Следует проявлять осторожность при передаче значения false для inheritThreadLocals, так как это может привести к непредвиденному поведению, если новый поток выполняет код, который ожидает наследования определенного значения локальной переменной.

Указание значения true для параметра inheritThreadLocals приведет к тому, что этот конструктор будет вести себя точно так же, как конструктор Thread(ThreadGroup, Runnable, String, long).

Параметры:
group - группа потоков. Если null и есть менеджер безопасности, группа определяется по SecurityManager.getThreadGroup(). Если менеджера безопасности нет или SecurityManager.getThreadGroup() возвращает null, группа устанавливается в группу потоков текущего потока.
target - объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name - имя нового потока
stackSize - желаемый размер стека для нового потока, или ноль, чтобы указать, что этот параметр игнорировать
inheritThreadLocals - если true, наследовать начальные значения для наследоваемых потоковых локалей от создающего потока, в противном случае начальные значения не наследуются
Исключения:
SecurityException - если текущий поток не может создать поток в заданной группе потоков
С:
9

Методы

currentThread

public static Thread currentThread()

Возвращает ссылку на объект потока, который выполняется в данный момент.

Возвращает:
текущий выполняющийся поток.

yield

public static void yield()

Предложение планировщику, что текущий поток готов уступить использование процессора. Планировщик может проигнорировать это предложение.

Функция yield — это эвристический способ улучшить относительное продвижение между потоками, которые в противном случае чрезмерно используют ЦП. Ее использование должно сопровождаться подробным профилированием и бенчмаркингом, чтобы гарантировать, что она действительно оказывает желаемый эффект.

В редких случаях целесообразно использовать этот метод. Он может быть полезен для отладки или тестирования, где он может помочь воспроизвести ошибки из-за гонок. Он также может быть полезен при проектировании конструкций управления параллельностью, таких как те, что в пакете java.util.concurrent.locks.

sleep

public static void sleep(long millis)
                  throws InterruptedException

Принудительно останавливает выполнение текущего потока на указанное количество миллисекунд, с учетом точности и достоверности системных таймеров и планировщиков. Поток не теряет владения мониторами.

Параметры:
millis - продолжительность сна в миллисекундах
Исключения:
IllegalArgumentException - если значение millis отрицательное
InterruptedException - если любой другой поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.

sleep

public static void sleep(long millis,
                         int nanos)
                  throws InterruptedException

Принудительно останавливает выполнение текущего потока на указанное количество миллисекунд и наносекунд, с учетом точности и достоверности системных таймеров и планировщиков. Поток не теряет владения мониторами.

Параметры:
millis - продолжительность сна в миллисекундах
nanos - 0-999999 дополнительные наносекунды сна
Исключения:
IllegalArgumentException - если значение millis отрицательное или значение nanos не находится в диапазоне 0-999999
InterruptedException - если любой другой поток прервал текущий поток. Статус прерывания текущего потока сбрасывается при возникновении этого исключения.

onSpinWait

public static void onSpinWait()

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

Примечание API:
Например, рассмотрим метод в классе, который вращается в цикле до тех пор, пока не будет установлен какой-то флаг вне этого метода. Вызов метода 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 Virtual Machine может выдать инструкции процессору для более эффективного обращения с такими шаблонами кода.

С:
9

clone

protected Object clone()
                throws CloneNotSupportedException

Выбрасывает исключение CloneNotSupportedException, так как поток не может быть клонирован осмысленно. Создайте новый поток вместо этого.

Переопределяет:
clone в классе Object
Возвращает:
клон этого экземпляра.
Исключения:
CloneNotSupportedException - всегда
См. также:
Cloneable

start

public void start()

Запускает выполнение этого потока; Java Virtual Machine вызывает метод 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(since="1.2")
public final void stop()
Устарело.
Этот метод по своей природе небезопасен. Остановка потока с помощью 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.

Исключения:
SecurityException - если текущий поток не может изменить этот поток.
См. также:
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 селектора.

Если ни одно из предыдущих условий не выполняется, то статус прерывания этого потока будет установлен.

Прерывание потока, который не активен, может не иметь эффекта.

Исключения:
SecurityException - если текущий поток не может изменить этот поток

interrupted

public static boolean interrupted()

Проверяет, была ли прервана текущая нить. Состояние прерывания нити сбрасывается этим методом. Другими словами, если этот метод был вызван дважды подряд, второй вызов вернёт false (если текущая нить не была прервана снова после того, как первый вызов сбросил её состояние прерывания и до того, как второй вызов проверил его).

Прерывание нити, игнорируемое, потому что нить не была активна во время прерывания, будет отражено в возвращаемом методом значении false.

Возвращает:
true если текущая нить была прервана; false в противном случае.
См. также:
isInterrupted()

isInterrupted

public boolean isInterrupted()

Проверяет, была ли прервана данная нить. Состояние прерывания нити не затрагивается этим методом.

Прерывание нити, игнорируемое, потому что нить не была активна во время прерывания, будет отражено в возвращаемом методом значении false.

Возвращает:
true если данная нить была прервана; false в противном случае.
См. также:
interrupted()

isAlive

public final boolean isAlive()

Проверяет, активна ли данная нить. Нить активна, если она была запущена и ещё не завершилась.

Возвращает:
true если данная нить активна; false в противном случае.

suspend

@Deprecated(since="1.2")
public final void suspend()
Устаревший.
Этот метод устарел, так как он потенциально приводит к тупиковым ситуациям (deadlock). Если целевая нить удерживает блокировку монитора, защищающего критический системный ресурс, когда она приостановлена, никакая другая нить не может получить доступ к этому ресурсу до тех пор, пока целевая нить не будет возобновлена. Если нить, которая должна возобновить целевую нить, пытается заблокировать этот монитор до вызова resume, возникает тупиковая ситуация. Такие тупиковые ситуации обычно проявляются как «зависшие» процессы. Для получения дополнительной информации см. Почему Thread.stop, Thread.suspend и Thread.resume устарели?.

Приостанавливает выполнение этой нити.

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

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

Исключение:
SecurityException - если текущая нить не может изменить данную нить.
См. также:
checkAccess()

resume

@Deprecated(since="1.2")
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 для получения оценки размера массива, однако если массив слишком короткий, чтобы вместить все нити, дополнительные нити будут проигнорированы. Если крайне важно получить все активные нити в группе нитей текущей нити и её подгруппах, вызывающий должен проверить, что возвращаемое целое значение строго меньше длины tarray.

Из-за внутренней гонки в этом методе рекомендуется использовать его только для целей отладки и мониторинга.

Параметры:
tarray - массив, в который нужно поместить список нитей
Возвращает:
количество нитей, помещённых в массив
Исключение:
SecurityException - если ThreadGroup.checkAccess() определяет, что текущая нить не может получить доступ к своей группе нитей

countStackFrames

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

Подсчитывает количество фреймов стека в этой нити. Нить должна быть приостановлена.

Возвращает:
количество фреймов стека в этой нити.
Исключение:
IllegalThreadStateException - если эта нить не приостановлена.
См. также:
StackWalker

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 наносекунд, пока данная нить завершится. Если оба аргумента равны 0, это означает ожидание вечно.

Это реализация использует цикл вызовов 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()

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

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()

Возвращает строковое представление этого потока, включая имя потока, приоритет и группу потоков.

Переопределяет:
toString в классе Object
Возвращает:
строковое представление этого потока.

getContextClassLoader

public ClassLoader getContextClassLoader()

Возвращает контекстный ClassLoader для этого потока. Контекстный ClassLoader предоставляется создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов. Если не установлен, по умолчанию используется ClassLoader контекст родительского потока. Контекстный ClassLoader первоначального потока обычно устанавливается в загрузчик классов, используемый для загрузки приложения.

Возвращает:
контекстный ClassLoader для этого потока или null указывающий на системный загрузчик классов (или, при отсутствии, загрузчик базовых классов)
Выбрасывает:
SecurityException - если присутствует менеджер безопасности, и загрузчик класса вызывающего не null и не совпадает с контекстным загрузчиком классов или не является его предком, и у вызывающего нет разрешения RuntimePermission("getClassLoader")
С:
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 от 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 будет вызван.

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

Обратите внимание, что обработчик необработанных исключений по умолчанию обычно не должен обращаться к объекту 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html

Spec-Zone .ru
спецификации, руководства, описания, API