Интерфейс ThreadReference
- Все суперинтерфейсы:
-
Mirror,ObjectReference,Value
public interface ThreadReference extends ObjectReference
ObjectReference с дополнительным доступом к информации о потоке из целевой виртуальной машины.- С:
- 1.3
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
THREAD_STATUS_MONITOR |
Поток ожидает монитор Java |
static final int |
THREAD_STATUS_NOT_STARTED |
Поток еще не запущен |
static final int |
THREAD_STATUS_RUNNING |
Поток готов к выполнению |
static final int |
THREAD_STATUS_SLEEPING |
Поток спит — Thread.sleep(long). |
static final int |
THREAD_STATUS_UNKNOWN |
Статус потока неизвестен |
static final int |
THREAD_STATUS_WAIT |
Поток ожидает — Object.wait() или LockSupport.park(). |
static final int |
THREAD_STATUS_ZOMBIE |
Поток завершил выполнение |
Поля, объявленные в интерфейсе com.sun.jdi.ObjectReference
INVOKE_NONVIRTUAL, INVOKE_SINGLE_THREADED
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
ObjectReference |
currentContendedMonitor() |
Возвращает ObjectReference для монитора, если таковой имеется, на котором в данный момент ожидает этот поток. |
void |
forceEarlyReturn |
Принудительно завершает метод до достижения оператора возврата. |
StackFrame |
frame |
Возвращает StackFrame по заданному индексу в текущем стеке вызовов потока. |
int |
frameCount() |
Возвращает количество кадров стека в текущем стеке вызовов потока. |
List |
frames() |
Возвращает список, содержащий каждый StackFrame в текущем стеке вызовов потока. |
List |
frames |
Возвращает список, содержащий диапазон StackFrame из текущего стека вызовов потока. |
void |
interrupt() |
Прерывает этот поток, если он не приостановлен отладчиком. |
boolean |
isAtBreakpoint() |
Определяет, приостановлен ли поток на точке останова. |
boolean |
isSuspended() |
Определяет, приостановлен ли поток отладчиком. |
default boolean |
isVirtual() |
Возвращает true, если поток является виртуальным потоком. |
String |
name() |
Возвращает имя этого потока. |
List |
ownedMonitors() |
Возвращает список, содержащий ObjectReference для каждого монитора, принадлежащего потоку. |
List |
ownedMonitorsAndFrames() |
Возвращает список, содержащий объект MonitorInfo для каждого монитора, принадлежащего потоку. |
void |
popFrames |
Удаляет кадры стека. |
void |
resume() |
Возобновляет этот поток. |
int |
status() |
Возвращает состояние потока. |
void |
stop |
Останавливает этот поток с асинхронным исключением. |
void |
suspend() |
Приостанавливает этот поток. |
int |
suspendCount() |
Возвращает количество ожидающих приостановок для этого потока. |
ThreadGroupReference |
threadGroup() |
Возвращает группу потоков этого потока. |
Методы, объявленные в интерфейсе com.sun.jdi.Mirror
toString, virtualMachine
Методы, объявленные в интерфейсе com.sun.jdi.ObjectReference
disableCollection, enableCollection, entryCount, equals, getValue, getValues, hashCode, invokeMethod, isCollected, owningThread, referenceType, referringObjects, setValue, uniqueID, waitingThreads
Подробное описание полей
THREAD_STATUS_UNKNOWN
static final int THREAD_STATUS_UNKNOWN
- См. также:
THREAD_STATUS_ZOMBIE
static final int THREAD_STATUS_ZOMBIE
- См. также:
THREAD_STATUS_RUNNING
static final int THREAD_STATUS_RUNNING
- См. также:
THREAD_STATUS_SLEEPING
THREAD_STATUS_MONITOR
static final int THREAD_STATUS_MONITOR
- См. также:
THREAD_STATUS_WAIT
static final int THREAD_STATUS_WAIT
Object.wait() или LockSupport.park(). Виртуальный поток, находящийся в режиме ожидания в Thread.sleep(long), может иметь этот статус потока вместо THREAD_STATUS_SLEEPING.- См. также:
THREAD_STATUS_NOT_STARTED
static final int THREAD_STATUS_NOT_STARTED
- См. также:
Подробное описание методов
name
String name()
- Возвращает:
- строку, содержащую имя потока.
suspend
void suspend()
resume() или возобновить вместе с другими потоками с помощью VirtualMachine.resume(). Приостановки как виртуальной машины, так и отдельных потоков учитываются. Перед тем, как поток снова сможет выполняться, он должен быть возобновлен (с помощью resume() или VirtualMachine.resume()) столько же раз, сколько раз он был приостановлен.
Приостановка отдельных потоков с помощью этого метода потенциально подвержена тупиковым ситуациям. Если приостановленный поток удерживает монитор, необходимый другому выполняемому потоку, возможна тупиковая ситуация в целевой виртуальной машине (по крайней мере, до тех пор, пока приостановленный поток не будет возобновлен).
Гарантируется, что приостановленный поток останется приостановленным до возобновления с помощью одного из методов возобновления JDI, упомянутых выше.
- Возбуждает:
-
VMCannotBeModifiedException- если VirtualMachine является только для чтения - См. также:
resume
void resume()
suspend() или VirtualMachine.suspend(), или из-за события SUSPEND_ALL или SUSPEND_EVENT_THREAD, вызов этого метода не оказывает никакого влияния. В противном случае счетчик ожидающих приостановок для этого потока уменьшается. Если он уменьшается до 0, поток продолжит выполнение. Примечание: обычный способ возобновления после приостановки, связанной с событием, осуществляется через EventSet.resume().- Возбуждает:
-
VMCannotBeModifiedException- если VirtualMachine является только для чтения - См. также:
suspendCount
int suspendCount()
suspend() для объяснения учтенных приостановок.- Возвращает:
- количество ожидающих приостановок как целое число
stop
void stop(ObjectReference throwable) throws InvalidTypeException
Throwable. Этот метод может использоваться для отправки асинхронного исключения виртуальному потоку, когда он приостановлен на событии. Реализация может поддерживать отправку асинхронного исключения приостановленному виртуальному потоку в других случаях.
- Параметры:
-
throwable- асинхронное исключение для выбрасывания - Возбуждает:
-
InvalidTypeException- еслиthrowableне является экземпляром java.lang.Throwable в целевой виртуальной машине -
IllegalThreadStateException- если поток завершен или если поток является виртуальным потоком и не был приостановлен -
OpaqueFrameException- если поток является приостановленным виртуальным потоком, и реализация не смогла сгенерировать асинхронное исключение из текущей рамки потока -
VMCannotBeModifiedException- если VirtualMachine является только для чтения - См. также:
interrupt
void interrupt()
- Возбуждает:
-
VMCannotBeModifiedException- если VirtualMachine является только для чтения - См. также:
status
int status()
THREAD_STATUS_UNKNOWN, если эта информация недоступна. isSuspended() может использоваться для определения, был ли поток приостановлен).isSuspended
boolean isSuspended()
- Возвращает:
-
true, если поток в настоящее время приостановлен;falseв противном случае.
isAtBreakpoint
boolean isAtBreakpoint()
- Возвращает:
-
true, если поток в настоящее время остановлен на точке останова;falseв противном случае.
threadGroup
ThreadGroupReference threadGroup()
- Возвращает:
- объект
ThreadGroupReference, отражающий группу потоков этого потока в целевой виртуальной машине.
frameCount
int frameCount() throws IncompatibleThreadStateException
- Возвращает:
- количество кадров стека в виде целого числа
- Возбуждает:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине
frames
List<StackFrame> frames() throws IncompatibleThreadStateException
StackFrame в текущем стеке вызовов потока. Для получения этой информации поток должен быть приостановлен (обычно через прерывание виртуальной машины), и она действительна только до возобновления потока.- Возвращает:
- список
StackFrame, где текущая рамка идёт первой, а затем рамки вызывающих методов. - Исключения:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине
frame
StackFrame frame(int index) throws IncompatibleThreadStateException
StackFrame с заданным индексом в текущем стеке вызовов потока. Индекс 0 возвращает текущую рамку; более высокие индексы возвращают рамки вызывающих методов. Для получения этой информации поток должен быть приостановлен (обычно через прерывание виртуальной машины), и она действительна только до возобновления потока.- Параметры:
-
index- нужная рамка - Возвращает:
- запрошенный
StackFrame - Исключения:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине -
IndexOutOfBoundsException- если индекс больше или равенframeCount()или отрицателен.
frames
List<StackFrame> frames(int start, int length) throws IncompatibleThreadStateException
StackFrame из текущего стека вызовов потока. Для получения этой информации поток должен быть приостановлен (обычно через прерывание виртуальной машины), и она действительна только до возобновления потока.- Параметры:
-
start- индекс первой рамки для извлечения. Индекс 0 соответствует текущей рамке. -
length- количество рамок для извлечения - Возвращает:
- список
StackFrame, где текущая рамка идёт первой, а затем рамки вызывающих методов. - Исключения:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине -
IndexOutOfBoundsException- если указанный диапазон не находится в диапазоне индексов стековых рамок. Исключение выбрасывается, если истинно одно из следующих условий:start < 0 start >=frameCount()length < 0 (start+length) >frameCount()
ownedMonitors
List<ObjectReference> ownedMonitors() throws IncompatibleThreadStateException
ObjectReference для каждого монитора, принадлежащего потоку. Монитор принадлежит потоку, если он был захвачен (через оператор synchronized или вход в синхронизированный метод) и не был высвобожден через Object.wait(). Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetOwnedMonitorInfo() для определения поддержки.
- Возвращает:
- список
ObjectReferenceобъектов. Список пуст, если этот поток не владеет ни одним монитором. - Исключения:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине
ownedMonitorsAndFrames
List<MonitorInfo> ownedMonitorsAndFrames() throws IncompatibleThreadStateException
MonitorInfo объект для каждого монитора, принадлежащего потоку. Монитор принадлежит потоку, если он был захвачен (через оператор synchronized или вход в синхронизированный метод) и не был высвобожден через Object.wait(). Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetMonitorFrameInfo() для определения поддержки.
- Возвращает:
- список
MonitorInfoобъектов. Список пуст, если этот поток не владеет ни одним монитором. - Исключения:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине - Since:
- 1.6
currentContendedMonitor
ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException
ObjectReference для монитора, если таковой имеется, на котором в данный момент ожидает этот поток. Поток может ожидать монитора через вход в синхронизированный метод, оператор synchronized или Object.wait() ожидания повторного входа в монитор после уведомления, прерывания или истечения таймаута. Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetCurrentContendedMonitor() для определения поддержки.
- Возвращает:
ObjectReferenceсоответствующий оспариваемому монитору, или null, если он не ожидает монитора.- Исключения:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине
popFrames
void popFrames(StackFrame frame) throws IncompatibleThreadStateException
Все рамки до и включая frame удаляются из стека. Рамка, предшествующая параметру frame, становится текущей рамкой.
После этой операции этот поток будет приостановлен на инструкции вызова целевого метода, который создал frame. Метод frame можно повторно войти с использованием инструкции пошагового входа.
Стек операндов восстанавливается, однако любые изменения аргументов, произошедшие в вызываемом методе, остаются. Например, если метод foo:
void foo(int x) {
System.out.println("Foo: " + x);
x = 4;
System.out.println("pop here");
}
был вызван с foo(7) и foo удаляется во второй println и возобновляется, он выведет: Foo: 4. Блокировки, полученные удалённой рамкой, освобождаются при её удалении. Это относится к синхронизированным методам, которые удаляются, и к любым синхронизированным блокам внутри них.
Блоки finally не выполняются.
Ни один аспект состояния, кроме точки выполнения этого потока и блокировок, не затрагивается этим вызовом. В частности, значения полей не изменяются, как и внешние ресурсы, такие как потоки ввода-вывода. Кроме того, целевая программа может быть помещена в состояние, которое невозможно при нормальном потоке выполнения; например, порядок получения блокировок может быть нарушен. Таким образом, целевая программа может действовать иначе, чем ожидалось пользователем.
Этот поток должен быть приостановлен.
Все StackFrame объекты для этого потока становятся недействительными.
Этот метод может быть использован для удаления рамок виртуального потока, когда он приостановлен в событии. Реализация может поддерживать удаление рамок приостановленного виртуального потока и в других случаях.
События этим методом не генерируются.
Ни одна из рамок до и включая рамку вызывающего метода frame не может быть нативной.
Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canPopFrames() для определения поддержки.
- Параметры:
-
frame- Рамка стека для удаления.frameнаходится в стеке вызовов этого потока. - Исключения:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию - см.VirtualMachine.canPopFrames(). -
IncompatibleThreadStateException- если этот поток не приостановлен. -
IllegalArgumentException- еслиframeне находится в стеке вызовов этого потока. -
OpaqueFrameException- если этот поток является приостановленным виртуальным потоком и целевая ВМ не смогла удалить рамки. -
NativeMethodException- если одна из рамок, которые должны быть удалены, является рамкой нативного метода или если рамка, предшествующая frame, является нативной. -
InvalidStackFrameException- еслиframeстала недействительной. После возобновления этого потока стековая рамка больше не действительна. Это исключение также выбрасывается, если больше нет рамок. -
VMCannotBeModifiedException- если VirtualMachine является только для чтения. - Since:
- 1.4
- См. также:
forceEarlyReturn
void forceEarlyReturn(Value value) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException
Метод, который будет завершен досрочно, называется вызываемым методом. Вызываемый метод — это текущий метод (как определено в разделе «Стек фреймов» в спецификации Java Virtual Machine) для указанного потока в момент вызова этого метода.
Поток должен быть приостановлен. Возврат происходит при возобновлении выполнения кода языка программирования Java в этом потоке. Состояние стека между вызовом этого метода и возобновлением выполнения потока неопределенно.
Этот метод может использоваться для принудительного возврата из текущей рамки виртуального потока, когда он приостановлен в событии. Реализация может поддерживать принудительный возврат из текущей рамки приостановленного виртуального потока и в других случаях.
Дальнейшие инструкции в вызываемом методе не выполняются. В частности, блоки finally не выполняются. Примечание: это может привести к несогласованному состоянию в приложении.
Блокировка, полученная при вызове вызываемого метода (если это синхронизированный метод), и блокировки, полученные при входе в синхронизированные блоки внутри вызываемого метода, освобождаются. Примечание: это не относится к нативным блокировкам или блокировкам java.util.concurrent.locks.
События, такие как MethodExit, генерируются так же, как и при обычном возврате.
Вызываемый метод должен быть обычным методом языка программирования Java (не нативным). Принудительный возврат в потоке с только одной рамкой на стеке приводит к выходу потока при возобновлении.
Аргумент value — это значение, которое должен вернуть метод. Если тип возврата метода void, то значение должно быть VoidValue. Объектные значения должны быть совместимы по присваиванию с типом возврата метода (это подразумевает, что тип возврата метода должен быть загружен через загрузчик класса содержащего класса). Примитивные значения должны быть совместимы по присваиванию с типом возврата метода или должны быть преобразуемы в тип переменной без потери информации. Подробнее об совместимости по присваиванию см. раздел JLS 5.2.
Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canForceEarlyReturn(), чтобы определить, поддерживается ли операция.
- Параметры:
-
value- значение, которое должен вернуть метод. - Исключение:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию - см.canForceEarlyReturn() -
IncompatibleThreadStateException- если этот поток не приостановлен. -
OpaqueFrameException- если этот поток является приостановленным виртуальным потоком, и целевая VM не может принудительно завершить метод. -
NativeMethodException- если рамка, из которой требуется возврат, принадлежит нативному методу. -
InvalidStackFrameException- если нет рамок. -
InvalidTypeException- если тип значения не соответствует типу возврата метода. -
ClassNotLoadedException- если тип возврата метода еще не загружен через соответствующий загрузчик классов. -
VMCannotBeModifiedException- если VirtualMachine является только для чтения. - С:
- 1.6
- См. также:
isVirtual
default boolean isVirtual()
true, если поток является виртуальным потоком.- Требования к реализации:
- Стандартная реализация выбрасывает
UnsupportedOperationException. - Возвращает:
- true, если поток — виртуальный
- С:
- 21
© 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.
https://download.java.net/java/early_access/jdk24/docs/api/jdk.jdi/com/sun/jdi/ThreadReference.html