Spec-Zone.ru › OpenJDK 27

Класс Thread

java.lang.Object
java.lang.Thread
Все реализуемые интерфейсы:
Runnable
Прямые известные подклассы:
ForkJoinWorkerThread
public class Thread extends Object implements Runnable
Поток — это последовательность выполнения программы. Виртуальная машина Java позволяет приложению одновременно выполнять несколько потоков.

Thread определяет конструкторы и Thread.Builder для создания потоков. Запуск потока планирует выполнение его метода run. Запущенный поток выполняется одновременно с потоком, который его запустил.

Поток завершается, если его метод run выполняется нормально либо если его метод run завершается аварийно, а соответствующий обработчик неперехваченных исключений завершается нормально или аварийно. Когда больше нет кода для выполнения, поток завершил работу. Метод isAlive можно использовать, чтобы проверить, завершился ли запущенный поток. Метод join можно использовать для ожидания завершения потока.

У потоков есть уникальный идентификатор и имя. Идентификатор создается при создании Thread и не может быть изменен. Имя потока можно указать при его создании или изменить позднее.

Потоки поддерживают переменные ThreadLocal. Это переменные, локальные для потока: у потока может быть собственная копия переменной со значением, независимым от значений, заданных другими потоками. Thread также поддерживает переменные InheritableThreadLocal — локальные для потока переменные, наследуемые от родительского Thread при создании потока. Thread поддерживает специальную наследуемую локальную переменную потока для загрузчика классов контекста потока.

Платформенные потоки

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

По умолчанию платформенные потоки получают автоматически сгенерированное имя.

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

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

Виртуальные потоки

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

Виртуальные потоки обычно используют небольшой набор платформенных потоков, называемых потоками-носителями. Блокировки и операции ввода-вывода — примеры операций, при которых поток-носитель может быть перепланирован с одного виртуального потока на другой. Код, выполняющийся в виртуальном потоке, не знает о лежащем в его основе потоке-носителе. Метод currentThread(), используемый для получения ссылки на текущий поток, всегда возвращает объект Thread для виртуального потока.

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

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

Создание и запуск потоков

Thread определяет открытые конструкторы для создания платформенных потоков и метод start для планирования выполнения потоков. Thread можно расширить для настройки и других продвинутых целей, хотя большинству приложений это, скорее всего, не понадобится.

Thread определяет API Thread.Builder для создания и запуска как платформенных, так и виртуальных потоков. Ниже приведены примеры использования построителя:

  Runnable runnable = ...

  // Start a daemon thread to run a task
  Thread thread = Thread.ofPlatform().daemon().start(runnable);

  // Create an unstarted thread with name "duke", its start() method
  // must be invoked to schedule it to execute.
  Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable);

  // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ...
  ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory();

  // Start a virtual thread to run a task
  Thread thread = Thread.ofVirtual().start(runnable);

  // A ThreadFactory that creates virtual threads
  ThreadFactory factory = Thread.ofVirtual().factory();

Наследование при создании потоков

Thread, созданный одним из открытых конструкторов, наследует статус демона и приоритет потока от родительского потока на момент создания дочернего Thread. Если группа потоков не указана в конструкторе, она также наследуется. При использовании Thread.Builder для создания платформенного потока статус демона, приоритет потока и группа потоков наследуются, если их не задать в построителе. Как и в случае с конструкторами, наследование от родительского потока происходит при создании дочернего Thread.

Thread наследует начальные значения переменных наследуемых локальных переменных потока (включая загрузчик классов контекста) от родительского потока на момент создания дочернего Thread. 5-параметрический конструктор можно использовать для создания потока, который не наследует начальные значения от создающего его потока. При использовании Thread.Builder метод inheritInheritableThreadLocals позволяет выбрать, следует ли наследовать начальные значения.

Прерывание потоков

У Thread есть статус прерывания, который служит запросом к выполняемому в потоке коду «остановить или отменить текущую операцию». Статус прерывания устанавливается вызовом метода interrupt() целевого потока. Многие методы, блокирующие поток или переводящие его в ожидание, являются прерываемыми: они обнаруживают установленный статус прерывания потока и досрочно возвращают управление из метода, обычно выбрасывая исключение.

Если поток, выполняющий Thread.sleep или Object.wait, прерывается, метод выбрасывает InterruptedException. Методы, выбрасывающие InterruptedException, сначала сбрасывают статус прерывания. Код, перехватывающий InterruptedException, должен повторно выбросить исключение либо восстановить статус прерывания текущего потока с помощью Thread.currentThread().interrupt(), прежде чем продолжить обычное выполнение или обработать исключение, выбросив исключение другого типа. Код, выбрасывающий исключение другого типа, указав InterruptedException в качестве причины или InterruptedException в качестве подавленного исключения, также должен восстановить статус прерывания перед выбрасыванием исключения.

Если прерывается поток, выполняющий блокирующую операцию ввода-вывода в InterruptibleChannel, канал закрывается, а блокирующая операция ввода-вывода выбрасывает ClosedByInterruptException; статус прерывания потока при этом установлен. Если прерывается поток, заблокированный при выполнении операции выбора, операция выбора досрочно возвращает управление, а статус прерывания потока остается установленным.

Код, не вызывающий прерываемые методы, все же может реагировать на прерывание, проверяя статус прерывания текущего потока с помощью Thread.currentThread().isInterrupted().

Помимо методов interrupt() и isInterrupted(), Thread также определяет статический метод Thread.interrupted(), который проверяет статус прерывания текущего потока и сбрасывает его. Обычно в этом методе нет необходимости.

Обработка null

Если не указано иное, передача аргумента null конструктору или методу этого класса приводит к выбрасыванию NullPointerException.
Примечание по реализации:
В эталонной реализации JDK планировщик виртуальных потоков можно настроить с помощью следующих системных свойств:
Системные свойства
Системное свойство Описание
jdk.virtualThreadScheduler.parallelism Целевой уровень параллелизма планировщика. Это количество платформенных потоков, доступных для планирования виртуальных потоков. По умолчанию оно равно количеству доступных процессоров.
jdk.virtualThreadScheduler.maxPoolSize Максимальное количество платформенных потоков, доступных планировщику. По умолчанию — 256.

Наблюдать за планировщиком виртуальных потоков и управлять им можно с помощью интерфейса управления jdk.management.VirtualThreadSchedulerMXBean.

Начиная с версии:
1.0

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

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

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

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

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

Конструктор Описание
Thread()
Инициализирует новый платформенный Thread.
Thread(Runnable task)
Инициализирует новый платформенный Thread.
Thread(Runnable task, String name)
Инициализирует новый платформенный Thread.
Thread(String name)
Инициализирует новый платформенный Thread.
Thread(ThreadGroup group, Runnable task)
Инициализирует новый платформенный Thread.
Thread(ThreadGroup group, Runnable task, String name)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, а он сам принадлежал группе потоков, на которую ссылается group.
Thread(ThreadGroup group, Runnable task, String name, long stackSize)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, а он сам принадлежал группе потоков, на которую ссылается group, и имел указанный размер стека.
Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Инициализирует новый платформенный Thread так, чтобы его объектом выполнения был task, его именем — указанное name, он принадлежал группе потоков, на которую ссылается group, имел указанный stackSize и наследовал начальные значения переменных наследуемых локальных переменных потока, если inheritThreadLocals имеет значение true.
Thread(ThreadGroup group, String name)
Инициализирует новый платформенный Thread.

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

Модификатор и тип Метод Описание
static int activeCount()
Возвращает оценочное количество активных платформенных потоков в группе потоков текущего потока и ее подгруппах.
final void checkAccess()
Устарело, планируется удаление: этот элемент API может быть удален в будущей версии.
Изначально этот метод определял, есть ли у выполняющегося в данный момент потока разрешение на изменение этого потока.
protected Object clone()
Выбрасывает CloneNotSupportedException, поскольку объект Thread нельзя осмысленно клонировать.
static Thread currentThread()
Возвращает объект Thread для текущего потока.
static void dumpStack()
Выводит трассировку стека текущего потока в стандартный поток ошибок.
static int enumerate(Thread[] tarray)
Копирует в указанный массив все активные платформенные потоки из группы потоков текущего потока и ее подгрупп.
static Map<Thread, StackTraceElement[]> getAllStackTraces()
Возвращает карту трассировок стека всех активных платформенных потоков.
ClassLoader getContextClassLoader()
Возвращает контекстный ClassLoader этого потока.
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
Возвращает обработчик по умолчанию, вызываемый при аварийном завершении потока из-за неперехваченного исключения.
long getId()
Устарело.
Этот метод не является final и может быть переопределен так, чтобы возвращать значение, отличное от идентификатора потока.
final String getName()
Возвращает имя этого потока.
final int getPriority()
Возвращает приоритет этого потока.
StackTraceElement[] getStackTrace()
Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока.
Thread.State getState()
Возвращает состояние этого потока.
final ThreadGroup getThreadGroup()
Возвращает группу потоков этого потока или null, если поток завершился.
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
Возвращает обработчик, вызываемый при аварийном завершении этого потока из-за неперехваченного исключения.
static boolean holdsLock(Object obj)
Возвращает true тогда и только тогда, когда текущий поток удерживает блокировку монитора указанного объекта.
void interrupt()
Прерывает этот поток.
static boolean interrupted()
Проверяет, был ли прерван текущий поток.
final boolean isAlive()
Проверяет, активен ли этот поток.
final boolean isDaemon()
Проверяет, является ли этот поток потоком-демоном.
boolean isInterrupted()
Проверяет, был ли прерван этот поток.
final boolean isVirtual()
Возвращает true, если этот поток является виртуальным.
final void join()
Ожидает завершения этого потока.
final void join(long millis)
Ожидает завершения этого потока не более millis миллисекунд.
final void join(long millis, int nanos)
Ожидает завершения этого потока не более millis миллисекунд и nanos наносекунд.
final boolean join(Duration duration)
Ожидает завершения этого потока в течение заданного времени ожидания.
static Thread.Builder.OfPlatform ofPlatform()
Возвращает построитель для создания платформенного Thread или ThreadFactory, создающего платформенные потоки.
static Thread.Builder.OfVirtual ofVirtual()
Возвращает построитель для создания виртуального Thread или ThreadFactory, создающего виртуальные потоки.
static void onSpinWait()
Сообщает, что вызывающий код временно не может продолжать выполнение до тех пор, пока не произойдут одно или несколько действий со стороны других задач.
void run()
Этот метод выполняется потоком при его запуске.
void setContextClassLoader(ClassLoader cl)
Устанавливает контекстный ClassLoader этого потока.
final void setDaemon(boolean on)
Помечает этот поток как демонный или недемонный.
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задает обработчик по умолчанию, вызываемый при аварийном завершении потока из-за неперехваченного исключения, если для этого потока не определен другой обработчик.
final void setName(String name)
Изменяет имя этого потока, задавая ему значение аргумента name.
final void setPriority(int newPriority)
Изменяет приоритет этого потока.
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задает обработчик, вызываемый при аварийном завершении этого потока из-за неперехваченного исключения.
static void sleep(long millis)
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанное количество миллисекунд с учетом точности и аккуратности системных таймеров и планировщиков.
static void sleep(long millis, int nanos)
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанное количество миллисекунд и наносекунд с учетом точности и аккуратности системных таймеров и планировщиков.
static void sleep(Duration duration)
Переводит выполняющийся в данный момент поток в спящее состояние (временно приостанавливает выполнение) на указанный промежуток времени с учетом точности и аккуратности системных таймеров и планировщиков.
void start()
Планирует запуск этого потока.
static Thread startVirtualThread(Runnable task)
Создает виртуальный поток для выполнения задачи и планирует его выполнение.
final long threadId()
Возвращает идентификатор этого объекта Thread.
String toString()
Возвращает строковое представление этого потока.
static void yield()
Подсказка планировщику о том, что текущий поток готов уступить текущее использование процессора.

Методы, объявленные в классе Object

equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Модификатор и тип Метод Описание
boolean equals(Object obj)
Указывает, является ли другой объект «равным» этому объекту.
protected void finalize()
Устарело, планируется удаление: этот элемент API может быть удален в будущей версии.
Финализация устарела и подлежит удалению в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает значение хеш-кода этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
final void wait()
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Переводит текущий поток в состояние ожидания до его пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка реального времени.

Подробное описание полей

MIN_PRIORITY

public static final int MIN_PRIORITY
Минимальный приоритет, который может иметь поток.
См. также:
  • Значения констант полей

NORM_PRIORITY

public static final int NORM_PRIORITY
Приоритет по умолчанию, назначаемый потоку.
См. также:
  • Значения констант полей

MAX_PRIORITY

public static final int MAX_PRIORITY
Максимальный приоритет, который может иметь поток.
См. также:
  • Значения констант полей

Подробное описание конструкторов

Thread

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

Этот конструктор полезен только при расширении Thread для переопределения метода run().

См. также:
  • Наследование при создании потоков

Thread

public Thread(Runnable task)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (null, task, gname), где gname — сгенерированное новое имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Если задача не равна null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform().unstarted(task); 
Параметры:
task — объект, метод run которого вызывается при запуске этого потока. Если null, метод run этого класса ничего не делает.
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (group, task, gname), где gname — сгенерированное новое имя. Автоматически сгенерированные имена имеют вид "Thread-"+n, где n — целое число.

Если группа и задача не равны null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform().group(group).unstarted(task); 
Параметры:
group — группа потоков. Если null, в качестве группы задается группа потоков текущего потока.
task — объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
См. также:
  • Наследование при создании потоков

Thread

public Thread(String name)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (null, null, name).

Этот конструктор полезен только при расширении Thread для переопределения метода run().

Параметры:
name — имя нового потока
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, String name)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (group, null, name).

Этот конструктор полезен только при расширении Thread для переопределения метода run().

Параметры:
group — группа потоков. Если null, в качестве группы задается группа потоков текущего потока.
name — имя нового потока
См. также:
  • Наследование при создании потоков

Thread

public Thread(Runnable task, String name)
Инициализирует новый платформенный Thread. Этот конструктор имеет тот же эффект, что и Thread (null, task, name).

Если задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform().name(name).unstarted(task); 
Параметры:
task — объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name — имя нового потока
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task, String name)
Инициализирует новый платформенный Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени и принадлежал группе потоков, на которую ссылается group.

Приоритет вновь созданного потока равен меньшему из приоритета создающего его потока и максимально допустимого приоритета группы потоков. Для изменения приоритета можно использовать метод setPriority.

Вновь созданный поток изначально помечается как поток-демон тогда и только тогда, когда создающий его поток в данный момент помечен как поток-демон. Чтобы изменить статус потока-демона, можно использовать метод setDaemon.

Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform().group(group).name(name).unstarted(task); 
Параметры:
group — группа потоков. Если null, в качестве группы задается группа потоков текущего потока.
task — объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name — имя нового потока
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task, String name, long stackSize)
Инициализирует новый платформенный Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени, принадлежал группе потоков, на которую ссылается group, и имел указанный размер стека.

Этот конструктор идентичен Thread(ThreadGroup,Runnable,String), за исключением того, что он позволяет указать размер стека потока. Размер стека — это приблизительное количество байтов адресного пространства, выделяемого виртуальной машиной для стека этого потока. Действие параметра stackSize, если таковое имеется, в значительной степени зависит от платформы.

На некоторых платформах указание большего значения параметра stackSize может позволить потоку достичь большей глубины рекурсии до возникновения исключения StackOverflowError. Аналогично, указание меньшего значения может позволить большему числу потоков существовать одновременно без возникновения исключения OutOfMemoryError (или другой внутренней ошибки). Зависимость между значением параметра stackSize и максимальной глубиной рекурсии и уровнем параллелизма определяется платформой. На некоторых платформах значение параметра stackSize может вообще не оказывать никакого влияния.

Виртуальная машина может рассматривать параметр stackSize как рекомендацию. Если указанное значение слишком мало для данной платформы, виртуальная машина может использовать вместо него некоторое минимальное значение, специфичное для платформы; если указанное значение слишком велико, виртуальная машина может использовать вместо него некоторое максимальное значение, специфичное для платформы. Аналогично, виртуальная машина может округлить указанное значение в большую или меньшую сторону по своему усмотрению (или полностью проигнорировать его).

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

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

Примечание по реализации: разработчикам платформы Java рекомендуется документировать поведение своей реализации относительно параметра stackSize.

Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform().group(group).name(name).stackSize(stackSize).unstarted(task); 
Параметры:
group — группа потоков. Если null, в качестве группы задается группа потоков текущего потока.
task — объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name — имя нового потока
stackSize — желаемый размер стека нового потока или ноль, если этот параметр следует игнорировать.
С версии:
1.4
См. также:
  • Наследование при создании потоков

Thread

public Thread(ThreadGroup group, Runnable task, String name, long stackSize, boolean inheritInheritableThreadLocals)
Инициализирует новый платформенный Thread так, чтобы в качестве объекта для выполнения он использовал task, имел указанное name в качестве имени, принадлежал группе потоков, на которую ссылается group, имел указанный stackSize и наследовал начальные значения переменных наследуемых локальных переменных потока, если inheritThreadLocals равно true.

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

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

Если группа, задача и имя не равны null, прямой вызов этого конструктора эквивалентен следующему:

Thread.ofPlatform()
     .group(group)
     .name(name)
     .stackSize(stackSize)
     .inheritInheritableThreadLocals(inheritInheritableThreadLocals)
     .unstarted(task); 
Параметры:
group — группа потоков. Если null, в качестве группы задается группа потоков текущего потока.
task — объект, метод run которого вызывается при запуске этого потока. Если null, вызывается метод run этого потока.
name — имя нового потока
stackSize — желаемый размер стека нового потока или ноль, если этот параметр следует игнорировать
inheritInheritableThreadLocals — если true, наследовать начальные значения наследуемых локальных переменных потока от создающего потока; в противном случае начальные значения не наследуются
С версии:
9
См. также:
  • Наследование при создании потоков

Подробное описание методов

currentThread

public static Thread currentThread()
Возвращает объект Thread для текущего потока.
Возвращает:
текущий поток

yield

public static void yield()
Подсказка планировщику о том, что текущий поток готов уступить процессор, которым он в данный момент пользуется. Планировщик может проигнорировать эту подсказку.

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

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

sleep

public static void sleep(long millis) throws InterruptedException
Приостанавливает выполнение текущего потока на указанное количество миллисекунд с учетом точности и разрешения системных таймеров и планировщиков. Поток не теряет владение какими-либо мониторами.
Параметры:
millis — продолжительность приостановки в миллисекундах
Выбрасывает:
IllegalArgumentException — если значение millis отрицательно
InterruptedException — если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.

sleep

public static void sleep(long millis, int nanos) throws InterruptedException
Приостанавливает выполнение текущего потока на указанное количество миллисекунд плюс указанное количество наносекунд с учетом точности и разрешения системных таймеров и планировщиков. Поток не теряет владение какими-либо мониторами.
Параметры:
millis — продолжительность приостановки в миллисекундах
nanos — дополнительные наносекунды приостановки 0-999999
Выбрасывает:
IllegalArgumentException — если значение millis отрицательно или значение nanos не входит в диапазон 0-999999
InterruptedException — если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.

sleep

public static void sleep(Duration duration) throws InterruptedException
Приостанавливает выполнение текущего потока на указанную продолжительность с учетом точности и разрешения системных таймеров и планировщиков. Этот метод ничего не делает, если продолжительность отрицательна.
Параметры:
duration — продолжительность приостановки
Выбрасывает:
InterruptedException — если текущий поток прерван во время приостановки. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
С версии:
19

onSpinWait

public static void onSpinWait()
Указывает, что вызывающий поток временно не может продолжать выполнение до тех пор, пока другие действия не приведут к одному или нескольким событиям. Вызывая этот метод на каждой итерации цикла активного ожидания, вызывающий поток сообщает среде выполнения, что он занят активным ожиданием. Среда выполнения может предпринять действия для повышения производительности конструкций циклов активного ожидания.
Примечание API:
Например, рассмотрим метод класса, который выполняет цикл, пока не будет установлен флаг, изменяемый вне этого метода. Внутри цикла активного ожидания следует разместить вызов метода onSpinWait.
    class EventHandler {
        volatile boolean eventNotificationNotReceived;
        void waitForEventAndHandleIt() {
            while ( eventNotificationNotReceived ) {
                Thread.onSpinWait();
            }
            readAndProcessEvent();
        }

        void readAndProcessEvent() {
            // Read event from some source and process it
             . . .
        }
    }

Приведенный выше код останется корректным, даже если метод onSpinWait вообще не вызывать. Однако на некоторых архитектурах виртуальная машина Java может выдавать инструкции процессору, позволяющие эффективнее обрабатывать такие шаблоны кода.

С версии:
9

ofPlatform

public static Thread.Builder.OfPlatform ofPlatform()
Возвращает построитель для создания платформенного Thread или ThreadFactory, создающего платформенные потоки.
Примечание API:
Ниже приведены примеры использования построителя:
  // Start a daemon thread to run a task
  Thread thread = Thread.ofPlatform().daemon().start(runnable);

  // Create an unstarted thread with name "duke", its start() method
  // must be invoked to schedule it to execute.
  Thread thread = Thread.ofPlatform().name("duke").unstarted(runnable);

  // A ThreadFactory that creates daemon threads named "worker-0", "worker-1", ...
  ThreadFactory factory = Thread.ofPlatform().daemon().name("worker-", 0).factory();
Возвращает:
Построитель для создания объектов Thread или ThreadFactory.
С версии:
21

ofVirtual

public static Thread.Builder.OfVirtual ofVirtual()
Возвращает построитель для создания виртуального Thread или ThreadFactory, создающего виртуальные потоки.
Примечание API:
Ниже приведены примеры использования построителя:
  // Start a virtual thread to run a task.
  Thread thread = Thread.ofVirtual().start(runnable);

  // A ThreadFactory that creates virtual threads
  ThreadFactory factory = Thread.ofVirtual().factory();
Возвращает:
Построитель для создания объектов Thread или ThreadFactory.
С версии:
21

clone

protected Object clone() throws CloneNotSupportedException
Выбрасывает CloneNotSupportedException, поскольку объект Thread нельзя осмысленно клонировать. Вместо этого создайте новый объект Thread.
Переопределяет:
clone в классе Object
Возвращает:
клон этого экземпляра.
Выбрасывает:
CloneNotSupportedException — всегда
См. также:
  • Cloneable

startVirtualThread

public static Thread startVirtualThread(Runnable task)
Создает виртуальный поток для выполнения задачи и планирует ее выполнение.

Этот метод эквивалентен следующему:

Thread.ofVirtual().start(task); 
Параметры:
task — объект, который будет выполнен потоком
Возвращает:
новый запущенный виртуальный поток
С версии:
21
См. также:
  • Наследование при создании потоков

isVirtual

public final boolean isVirtual()
Возвращает true, если этот поток является виртуальным. Виртуальный поток планируется виртуальной машиной Java, а не операционной системой.
Возвращает:
true, если этот поток является виртуальным
С версии:
21

start

public void start()
Планирует запуск этого потока. Поток будет выполняться независимо от текущего потока.

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

Выбрасывает:
IllegalThreadStateException — если поток уже был запущен

run

public void run()
Этот метод выполняется потоком при его запуске. Подклассы Thread могут переопределять этот метод.

Этот метод не предназначен для прямого вызова. Если этот поток является платформенным потоком, созданным с задачей Runnable, то вызов этого метода вызовет метод run задачи. Если этот поток является виртуальным, прямой вызов этого метода ничего не делает.

Определено в:
run в интерфейсе Runnable
Требования к реализации:
Реализация по умолчанию выполняет задачу Runnable, с которой был создан объект Thread. Если поток создан без задачи, этот метод ничего не делает.

interrupt

public void interrupt()
Прерывает этот поток.

Если этот поток заблокирован при вызове методов wait(), wait(long) или wait(long, int) класса Object либо методов join(), join(long), join(long, int), sleep(long) или sleep(long, int) этого класса, его статус прерывания будет сброшен, и он получит исключение InterruptedException.

Если этот поток заблокирован в операции ввода-вывода через InterruptibleChannel, канал будет закрыт, статус прерывания потока будет установлен, и поток получит исключение ClosedByInterruptException.

Если этот поток заблокирован в Selector, статус прерывания потока будет установлен, и поток немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод wakeup селектора.

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

Прерывание неактивного потока не обязательно должно иметь какой-либо эффект.

Примечание по реализации:
В эталонной реализации JDK прерывание неактивного потока все равно сохраняет факт получения запроса на прерывание; его можно проверить с помощью методов interrupted() и isInterrupted().
См. также:
  • Прерывание потока
  • isInterrupted()

interrupted

public static boolean interrupted()
Проверяет, был ли прерван текущий поток. Этот метод сбрасывает статус прерывания потока. Иными словами, если вызвать этот метод два раза подряд, второй вызов вернет false (если только текущий поток не будет прерван повторно после того, как первый вызов сбросил его статус прерывания, но до того, как второй вызов проверил его).
Примечание API:
Этот метод редко требуется использовать напрямую. Он предназначен для случаев, когда обнаруживается прерывание потока и статус прерывания сбрасывается перед выбрасыванием исключения InterruptedException. Он также может быть полезен при реализации непрерываемого метода, использующего прерываемый метод, например LockSupport.park(). Метод interrupted() можно использовать для проверки наличия прерывания и сброса статуса прерывания, чтобы код мог повторить вызов прерываемого метода. Перед завершением непрерываемый метод должен восстановить статус прерывания.
Возвращает:
true, если текущий поток был прерван; в противном случае — false.
См. также:
  • Прерывание потока
  • isInterrupted()

isInterrupted

public boolean isInterrupted()
Проверяет, был ли прерван этот поток. Этот метод не изменяет статус прерывания потока.
Возвращает:
true, если этот поток был прерван; в противном случае — false.
См. также:
  • Прерывание потока
  • interrupt()

isAlive

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

setPriority

public final void setPriority(int newPriority)
Изменяет приоритет этого потока. Для платформенных потоков приоритет устанавливается равным меньшему из указанного newPriority и максимально допустимого приоритета группы потоков. Приоритет виртуального потока всегда равен NORM_PRIORITY, а newPriority игнорируется.
Параметры:
newPriority — новый приоритет потока
Выбрасывает:
IllegalArgumentException — если приоритет не входит в диапазон от MIN_PRIORITY до MAX_PRIORITY.
См. также:
  • setPriority(int)
  • ThreadGroup.getMaxPriority()

getPriority

public final int getPriority()
Возвращает приоритет этого потока.

Приоритет виртуального потока всегда равен NORM_PRIORITY.

Возвращает:
приоритет этого потока.
См. также:
  • setPriority(int)

setName

public final void setName(String name)
Изменяет имя этого потока, присваивая ему значение аргумента name.
Примечание по реализации:
В эталонной реализации JDK, если этот поток является текущим потоком и представляет собой платформенный поток, который не был присоединён к виртуальной машине с помощью функции Java Native Interface AttachCurrentThread, этот метод задаёт имя потока операционной системы. Это может быть полезно для отладки и устранения неполадок.
Параметры:
name — новое имя этого потока.
Внешние спецификации
  • Спецификация Java Native Interface
См. также:
  • getName()

getName

public final String getName()
Возвращает имя этого потока.
Возвращает:
имя этого потока.
См. также:
  • setName(String)

getThreadGroup

public final ThreadGroup getThreadGroup()
Возвращает группу потоков этого потока или null, если поток завершил работу.

Для виртуального потока возвращается специальная группа ThreadGroup для виртуальных потоков.

Возвращает:
группу потоков этого потока или null

activeCount

public static int activeCount()
Возвращает оценочное количество работающих платформенных потоков в группе потоков текущего потока и её подгруппах. Виртуальные потоки не учитываются.

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

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

enumerate

public static int enumerate(Thread[] tarray)
Копирует в указанный массив каждый работающий платформенный поток из группы потоков текущего потока и её подгрупп. Этот метод просто вызывает метод ThreadGroup.enumerate(Thread[]) группы потоков текущего потока. Виртуальные потоки этим методом не перечисляются.

Приложение может использовать метод activeCount, чтобы оценить необходимый размер массива, однако если массив слишком мал для размещения всех потоков, лишние потоки будут молча проигнорированы. Если необходимо получить каждый работающий поток из группы потоков текущего потока и её подгрупп, вызывающий код должен проверить, что возвращённое значение типа int строго меньше длины tarray.

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

Параметры:
tarray — массив, в который следует поместить список потоков
Возвращает:
количество потоков, помещённых в массив

join

public final void join(long millis) throws InterruptedException
Ожидает завершения этого потока не более millis миллисекунд. Значение тайм-аута 0 означает ожидание без ограничения времени. Этот метод возвращает управление немедленно, не ожидая, если поток ещё не был started.
Примечание по реализации:
В этой реализации используется цикл вызовов this.wait с условием this.isAlive. При завершении потока вызывается метод this.notifyAll. Рекомендуется не использовать в приложениях wait, notify или notifyAll для экземпляров Thread.
Параметры:
millis — время ожидания в миллисекундах
Выбрасывает:
IllegalArgumentException — если значение millis отрицательно
InterruptedException — если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.

join

public final void join(long millis, int nanos) throws InterruptedException
Ожидает завершения этого потока не более millis миллисекунд плюс nanos наносекунд. Если оба аргумента равны 0, это означает ожидание без ограничения времени. Этот метод возвращает управление немедленно, не ожидая, если поток ещё не был started.
Примечание по реализации:
В этой реализации используется цикл вызовов this.wait с условием this.isAlive. При завершении потока вызывается метод this.notifyAll. Рекомендуется не использовать в приложениях wait, notify или notifyAll для экземпляров Thread.
Параметры:
millis — время ожидания в миллисекундах
nanos — 0-999999 дополнительные наносекунды ожидания
Выбрасывает:
IllegalArgumentException — если значение millis отрицательно или значение nanos не входит в диапазон 0-999999
InterruptedException — если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.

join

public final void join() throws InterruptedException
Ожидает завершения этого потока.

Вызов этого метода ведёт себя точно так же, как вызов

join(0)
Выбрасывает:
InterruptedException — если какой-либо поток прервал текущий поток. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.

join

public final boolean join(Duration duration) throws InterruptedException
Ожидает завершения этого потока в течение указанного времени ожидания.

Этот метод не ожидает, если время ожидания меньше или равно нулю. В этом случае метод лишь проверяет, завершил ли поток работу.

Параметры:
duration — максимальное время ожидания
Возвращает:
true, если поток завершил работу, false, если поток не завершил работу
Выбрасывает:
InterruptedException — если текущий поток прерван во время ожидания. При выбрасывании этого исключения статус прерывания текущего потока сбрасывается.
IllegalThreadStateException — если этот поток не был запущен.
Начиная с:
19

dumpStack

public static void dumpStack()
Выводит трассировку стека текущего потока в стандартный поток ошибок. Этот метод полезен для отладки.

setDaemon

public final void setDaemon(boolean on)
Помечает этот поток как демон-поток или обычный поток. Последовательность завершения работы начинается, когда завершаются все запущенные обычные потоки.

Статус виртуального потока как потока-демона всегда равен true; этот метод не может изменить его на false.

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

Параметры:
on — если true, помечает этот поток как поток-демон
Выбрасывает:
IllegalArgumentException — если это виртуальный поток и on равно false
IllegalThreadStateException — если этот поток работает

isDaemon

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

checkAccess

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

toString

public String toString()
Возвращает строковое представление этого потока. Обычно строковое представление содержит идентификатор и имя потока. Реализация по умолчанию для платформенных потоков включает идентификатор и имя потока, его приоритет и имя группы потоков.
Переопределяет:
toString в классе Object
Возвращает:
строковое представление этого потока.

getContextClassLoader

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

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

Возвращает:
контекстный ClassLoader этого потока или null, обозначающий системный загрузчик классов (или, если он недоступен, загрузчик классов начальной загрузки)
Начиная с:
1.2

setContextClassLoader

public void setContextClassLoader(ClassLoader cl)
Задаёт контекстный ClassLoader этого потока.

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

Параметры:
cl — контекстный загрузчик классов этого потока или null, обозначающий системный загрузчик классов (или, если он недоступен, загрузчик классов начальной загрузки)
Начиная с:
1.2

holdsLock

public static boolean holdsLock(Object obj)
Возвращает true тогда и только тогда, когда текущий поток удерживает мониторную блокировку указанного объекта.

Этот метод предназначен для того, чтобы программа могла утверждать, что текущий поток уже удерживает указанную блокировку:

    assert Thread.holdsLock(obj);
Параметры:
obj — объект, для которого проверяется владение блокировкой
Возвращает:
true, если текущий поток удерживает мониторную блокировку указанного объекта.
Начиная с:
1.4

getStackTrace

public StackTraceElement[] getStackTrace()
Возвращает массив элементов трассировки стека, представляющих дамп стека этого потока. Метод возвращает массив нулевой длины, если этот поток не запущен, уже запущен, но ещё не запланирован системой для выполнения, либо завершил работу. Если возвращённый массив не пуст, его первый элемент представляет вершину стека, то есть последний по времени вызов метода в последовательности. Последний элемент массива представляет основание стека, то есть самый давний вызов метода в последовательности.

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

Возвращает:
массив StackTraceElement, каждый элемент которого представляет один кадр стека.
Начиная с:
1.5
См. также:
  • Throwable.getStackTrace()

getAllStackTraces

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

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

Возвращает:
Map, сопоставляющую Thread массив StackTraceElement, представляющий трассировку стека соответствующего потока.
Начиная с:
1.5
См. также:
  • getStackTrace()
  • Throwable.getStackTrace()

getId

@Deprecated(since="19") public long getId()
Устарело.
Этот метод не является final и может быть переопределён так, чтобы возвращать значение, не являющееся идентификатором потока. Вместо него используйте threadId().
Возвращает идентификатор этого потока. Идентификатор потока — это положительное число long, генерируемое при создании потока. Идентификатор потока уникален и не изменяется в течение всего времени его существования.
Возвращает:
идентификатор этого потока
Начиная с:
1.5

threadId

public final long threadId()
Возвращает идентификатор этого потока. Идентификатор потока — это положительное число long, генерируемое при создании потока. Идентификатор потока уникален и не изменяется в течение всего времени его существования.
Возвращает:
идентификатор этого потока
Начиная с:
19

getState

public Thread.State getState()
Возвращает состояние этого потока. Этот метод предназначен для мониторинга состояния системы, а не для управления синхронизацией.
Возвращает:
состояние этого потока.
Начиная с:
1.5

setDefaultUncaughtExceptionHandler

public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задаёт обработчик по умолчанию, вызываемый при внезапном завершении потока из-за неперехваченного исключения, если для этого потока не определён другой обработчик.

Обработка неперехваченных исключений сначала контролируется самим потоком, затем объектом ThreadGroup потока и, наконец, обработчиком неперехваченных исключений по умолчанию. Если для потока явно не задан обработчик неперехваченных исключений, а группа потоков этого потока (включая родительские группы потоков) не переопределяет метод uncaughtException, будет вызван метод uncaughtException обработчика по умолчанию.

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

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

Параметры:
ueh — объект, используемый в качестве обработчика неперехваченных исключений по умолчанию. Если значение равно null, обработчик по умолчанию отсутствует.
Начиная с:
1.5
См. также:
  • setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
  • getUncaughtExceptionHandler()
  • ThreadGroup.uncaughtException(Thread, Throwable)

getDefaultUncaughtExceptionHandler

public static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler()
Возвращает обработчик по умолчанию, вызываемый при внезапном завершении потока из-за неперехваченного исключения. Если возвращаемое значение равно null, обработчик по умолчанию отсутствует.
Возвращает:
обработчик неперехваченных исключений по умолчанию для всех потоков
Начиная с:
1.5
См. также:
  • setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)

getUncaughtExceptionHandler

public Thread.UncaughtExceptionHandler getUncaughtExceptionHandler()
Возвращает обработчик, вызываемый при внезапном завершении этого потока из-за неперехваченного исключения. Если для этого потока явно не задан обработчик неперехваченных исключений, возвращается объект ThreadGroup этого потока, если только поток не завершил работу; в последнем случае возвращается null.
Возвращает:
обработчик неперехваченных исключений этого потока
Начиная с:
1.5

setUncaughtExceptionHandler

public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ueh)
Задаёт обработчик, вызываемый при внезапном завершении этого потока из-за неперехваченного исключения.

Поток может полностью контролировать реакцию на неперехваченные исключения, если для него явно задан обработчик неперехваченных исключений. Если такой обработчик не задан, его роль выполняет объект ThreadGroup этого потока.

Параметры:
ueh — объект, используемый в качестве обработчика неперехваченных исключений этого потока. Если значение равно null, у потока нет явного обработчика.
Начиная с:
1.5
См. также:
  • setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
  • ThreadGroup.uncaughtException(Thread, Throwable)

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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.

Spec-Zone.ru

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