Интерфейс 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
static final int THREAD_STATUS_SLEEPING
Thread.sleep(long).- См. также:
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() может использоваться для определения, был ли поток приостановлен).- Возвращает:
- одно из
THREAD_STATUS_UNKNOWN,THREAD_STATUS_ZOMBIE,THREAD_STATUS_RUNNING,THREAD_STATUS_SLEEPING,THREAD_STATUS_MONITOR,THREAD_STATUS_WAIT,THREAD_STATUS_NOT_STARTED,
isSuspended
boolean isSuspended()
- Возвращает:
-
trueесли поток в данный момент приостановлен;falseв противном случае.
isAtBreakpoint
boolean isAtBreakpoint()
- Возвращает:
-
trueесли поток в данный момент остановлен на точке останова;falseв противном случае.
threadGroup
ThreadGroupReference threadGroup()
- Возвращает:
- a
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 возвращает текущую рамку; более высокие индексы возвращают кадры вызывающих функций. Поток должен быть приостановлен (обычно через прерывание виртуальной машины), чтобы получить эту информацию, и она действительна только до возобновления потока.- Parameters:
-
index- требуемая рамка - Returns:
- запрашиваемый
StackFrame - Throws:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине -
IndexOutOfBoundsException- если индекс больше или равенframeCount()или отрицателен.
frames
List<StackFrame> frames(int start, int length) throws IncompatibleThreadStateException
StackFrame зеркал из текущей стека вызовов потока. Поток должен быть приостановлен (обычно через прерывание виртуальной машины), чтобы получить эту информацию, и она действительна только до возобновления потока.- Parameters:
-
start- индекс первой рамки для извлечения. Индекс 0 представляет текущую рамку. -
length- количество рамок для извлечения - Returns:
- список
StackFrameс текущей рамкой в начале, за которой следуют кадры каждой вызывающей функции. - Throws:
-
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине -
IndexOutOfBoundsException- если указанный диапазон не находится в пределах диапазона индексов стековых рамок. То есть исключение выбрасывается, если любое из следующего верно:start < 0 start >=frameCount()length < 0 (start+length) >frameCount()
ownedMonitors
List<ObjectReference> ownedMonitors() throws IncompatibleThreadStateException
ObjectReference для каждого монитора, принадлежащего потоку. Монитор принадлежит потоку, если он был введён (через оператор synchronized или вход в синхронизированный метод) и не был освобожден через Object.wait(). Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetOwnedMonitorInfo(), чтобы определить, поддерживается ли операция.
- Returns:
- список
ObjectReferenceобъектов. Список имеет нулевую длину, если этот поток не владеет ни одним монитором. - Throws:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине
ownedMonitorsAndFrames
List<MonitorInfo> ownedMonitorsAndFrames() throws IncompatibleThreadStateException
MonitorInfo для каждого монитора, принадлежащего потоку. Монитор принадлежит потоку, если он был введён (через оператор synchronized или вход в синхронизированный метод) и не был освобожден через Object.wait(). Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetMonitorFrameInfo(), чтобы определить, поддерживается ли операция.
- Returns:
- список объектов
MonitorInfo. Список имеет нулевую длину, если этот поток не владеет ни одним монитором. - Throws:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию. -
IncompatibleThreadStateException- если поток не приостановлен в целевой виртуальной машине - Since:
- 1.6
currentContendedMonitor
ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException
ObjectReference для монитора, если таковой имеется, в ожидании которого находится данный поток. Поток может ожидать монитора, войдя в синхронизированный метод, оператор synchronized или вызов Object.wait(). Метод status() можно использовать для различения первых двух случаев и третьего. Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canGetCurrentContendedMonitor(), чтобы определить, поддерживается ли операция.
- Returns:
ObjectReference, соответствующий конкурирующему монитору, или null, если поток не ожидает монитора.- Throws:
-
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(), чтобы определить, поддерживается ли операция.
- Parameters:
-
frame- Кадр стека для выталкивания.frameнаходится в стеке вызовов этого потока. - Throws:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию - см.VirtualMachine.canPopFrames(). -
IncompatibleThreadStateException- если этот поток не приостановлен. -
IllegalArgumentException- еслиframeне находится в стеке вызовов этого потока. -
OpaqueFrameException- если этот поток является приостановленным виртуальным потоком, и целевая виртуальная машина не смогла вытолкнуть кадры. -
NativeMethodException- если один из кадров, которые должны быть вытолкнуты, относится к нативному методу, или если кадр, предшествующий frame, является нативным. -
InvalidStackFrameException- еслиframeстал недействительным. После возобновления этого потока кадр стека становится недействительным. Это исключение также выбрасывается, если больше нет кадров. -
VMCannotBeModifiedException- если VirtualMachine является только для чтения. - Since:
- 1.4
- See Also:
forceEarlyReturn
void forceEarlyReturn(Value value) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException
Метод, который будет завершен досрочно, называется вызываемым методом. Вызываемый метод — это текущий метод (как определено в разделе "Frames" спецификации Java Virtual Machine) для указанного потока в момент вызова этого метода.
Поток должен быть приостановлен. Возврат происходит при возобновлении выполнения кода языка программирования Java в этом потоке. Состояние стека между вызовом этого метода и возобновлением выполнения потока не определено.
Этот метод может быть использован для принудительного возврата из текущей рамки виртуального потока, когда он приостановлен в результате события. Реализация может поддерживать принудительный возврат из текущей рамки приостановленного виртуального потока и в других случаях.
В вызываемом методе не будут выполнены дальнейшие инструкции. В частности, блоки finally не будут выполнены. Примечание: это может привести к несогласованному состоянию в приложении.
Блокировка, полученная вызовом вызываемого метода (если это синхронизированный метод), и блокировки, полученные при входе в синхронизированные блоки внутри вызываемого метода, будут освобождены. Примечание: это не относится к нативным блокировкам или блокировкам java.util.concurrent.locks.
События, такие как MethodExit, генерируются так же, как и при обычном возврате.
Вызываемый метод должен быть не-нативным методом языка программирования Java. Принудительный возврат в потоке с одной рамкой стека приводит к завершению потока при возобновлении.
Аргумент value — это значение, которое метод должен вернуть. Если тип возврата метода void, то значение должно быть объектом типа VoidValue. Объектные значения должны быть совместимы с типом возврата метода (Это подразумевает, что тип возврата метода должен быть загружен через загрузчик классов содержащего класса). Примитивные значения должны быть либо совместимы с типом возврата метода, либо должны быть конвертированы в тип переменной без потери информации. См. раздел JLS 5.2 для получения дополнительной информации о совместимости присваивания.
Не все целевые виртуальные машины поддерживают эту операцию. Используйте VirtualMachine.canForceEarlyReturn() для определения поддержки операции.
- Параметры:
-
value- значение, которое метод должен вернуть. - Исключения:
-
UnsupportedOperationException- если целевая виртуальная машина не поддерживает эту операцию — см.canForceEarlyReturn() -
IncompatibleThreadStateException- если этот поток не приостановлен. -
OpaqueFrameException- если этот поток — приостановленный виртуальный поток, и целевая ВМ не может принудительно завершить метод. -
NativeMethodException- если рамка, из которой необходимо вернуться, принадлежит нативному методу. -
InvalidStackFrameException- если нет рамок. -
InvalidTypeException- если тип значения не соответствует типу возврата метода. -
ClassNotLoadedException- если тип возврата метода еще не загружен через соответствующий загрузчик классов. -
VMCannotBeModifiedException- если VirtualMachine является только для чтения. - С:
- 1.6
- См. также:
isVirtual
default boolean isVirtual()
true значение, если поток является виртуальным потоком.- Требования к реализации:
- По умолчанию реализация выбрасывает
UnsupportedOperationException. - Возвращает:
- true, если поток является виртуальным потоком
- С:
- 21
© 1993, 2023, 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/21/docs/api/jdk.jdi/com/sun/jdi/ThreadReference.html