-
- All Superinterfaces:
-
Mirror
,ObjectReference
,Value
public interface ThreadReference extends ObjectReference
来自目标VM的线程对象。 ThreadReference是一个ObjectReference
,可以额外访问来自目标VM的线程特定信息。- 从以下版本开始:
- 1.3
-
-
Field Summary
Fields Modifier and Type Field 描述 static int
THREAD_STATUS_MONITOR
线程正在等待一个java监视器static int
THREAD_STATUS_NOT_STARTED
线程尚未启动static int
THREAD_STATUS_RUNNING
线程是可运行的static int
THREAD_STATUS_SLEEPING
线程正在睡眠 - Thread.sleep()或JVM_Sleep()被调用static int
THREAD_STATUS_UNKNOWN
线程状态未知static int
THREAD_STATUS_WAIT
线程正在等待 - Object.wait()或JVM_MonitorWait()被调用static int
THREAD_STATUS_ZOMBIE
线程已完成执行-
Fields inherited from interface com.sun.jdi.ObjectReference
INVOKE_NONVIRTUAL, INVOKE_SINGLE_THREADED
-
-
方法摘要
所有方法 接口方法 抽象方法 Modifier and Type 方法 描述 ObjectReference
currentContendedMonitor()
返回一个ObjectReference
的显示器,如果有的话,这个线程当前正在等待。void
forceEarlyReturn(Value value)
强制一个方法在返回到返回语句之前返回。StackFrame
frame(int index)
返回线程当前调用堆栈中给定索引的StackFrame
。int
frameCount()
返回线程当前调用堆栈中的堆栈帧数。List<StackFrame>
frames()
返回一个列表,其中包含线程当前调用堆栈中的每个StackFrame
。List<StackFrame>
frames(int start, int length)
返回一个列表,该列表包含线程当前调用堆栈的StackFrame
镜像范围。void
interrupt()
中断此线程,除非线程已被调试器挂起。boolean
isAtBreakpoint()
确定线程是否在断点处挂起。boolean
isSuspended()
确定线程是否已被调试器挂起。String
name()
返回此线程的名称。List<ObjectReference>
ownedMonitors()
返回列表,该列表包含线程拥有的每个监视器的ObjectReference
。List<MonitorInfo>
ownedMonitorsAndFrames()
返回一个列表,该列表包含线程拥有的每个监视器的一个MonitorInfo
对象。void
popFrames(StackFrame frame)
弹出框架。void
resume()
恢复此线程。int
status()
返回线程的状态。void
stop(ObjectReference throwable)
停止此线程与异步异常。void
suspend()
暂停这个线程。int
suspendCount()
返回此线程的待处理挂起数。ThreadGroupReference
threadGroup()
返回此线程的线程组。-
Methods inherited from interface com.sun.jdi.Mirror
toString, virtualMachine
-
Methods inherited from interface 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
线程状态未知- 另请参见:
- Constant Field Values
-
THREAD_STATUS_ZOMBIE
static final int THREAD_STATUS_ZOMBIE
线程已完成执行- 另请参见:
- Constant Field Values
-
THREAD_STATUS_RUNNING
static final int THREAD_STATUS_RUNNING
线程是可运行的- 另请参见:
- Constant Field Values
-
THREAD_STATUS_SLEEPING
static final int THREAD_STATUS_SLEEPING
线程正在睡眠 - Thread.sleep()或JVM_Sleep()被调用- 另请参见:
- Constant Field Values
-
THREAD_STATUS_MONITOR
static final int THREAD_STATUS_MONITOR
线程正在等待一个java监视器- 另请参见:
- Constant Field Values
-
THREAD_STATUS_WAIT
static final int THREAD_STATUS_WAIT
线程正在等待 - Object.wait()或JVM_MonitorWait()被调用- 另请参见:
- Constant Field Values
-
THREAD_STATUS_NOT_STARTED
static final int THREAD_STATUS_NOT_STARTED
线程尚未启动- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
name
String name()
返回此线程的名称。- 结果
- 该字符串包含线程名称。
-
suspend
void suspend()
暂停这个线程。 该线程可以通过恢复resume()
或通过与其他线程恢复VirtualMachine.resume()
。与
Thread.suspend()
不同,虚拟机和单个线程的暂停计数。 在线程再次运行之前,它必须恢复(通过resume()
或resume()
)它已被挂起的次数。使用此方法暂停单线程与
Thread.suspend()
具有相同的危险。 如果挂起的线程保持另一个正在运行的线程所需的监视器,目标VM中可能会发生死锁(至少直到再次恢复挂起的线程)。暂停线程保持暂停,直到通过上述JDI恢复方法恢复; 目标VM中的应用程序无法通过
Thread.resume()
恢复挂起的线程。- 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
resume
void resume()
恢复此线程。 如果此线程以前未被暂停通过suspend()
或通过VirtualMachine.suspend()
或由于SUSPEND_ALL或SUSPEND_EVENT_THREAD事件,则调用此方法不起作用。 否则,此线程上的待处理挂起计数减少。 如果它递减到0,线程将继续执行。 注意:从事件相关的暂停恢复的正常方式是通过EventSet.resume()
。- 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。
-
suspendCount
int suspendCount()
返回此线程的待处理挂起数。 有关计数暂停的说明,请参阅suspend()
。- 结果
- 待处理挂起计数为整数
-
stop
void stop(ObjectReference throwable) throws InvalidTypeException
停止此线程与异步异常。 目标VM中的调试器线程将使用给定的Throwable
对象停止此线程。- 参数
-
throwable
- 异步异常抛出。 - 异常
-
InvalidTypeException
- 如果throwable
不是目标VM中的java.lang.Throwable的实例。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的,请参阅VirtualMachine.canBeModified()
。 - 另请参见:
-
Thread.stop(Throwable)
-
interrupt
void interrupt()
中断此线程,除非线程已被调试器挂起。- 异常
-
VMCannotBeModifiedException
- 如果VirtualMachine是只读的,请参阅VirtualMachine.canBeModified()
。 - 另请参见:
-
Thread.interrupt()
-
status
int status()
返回线程的状态。 如果线程不挂起,则返回线程的当前状态。 如果线程被暂停,则返回线程的挂起状态(如果此信息不可用,则返回THREAD_STATUS_UNKNOWN
)isSuspended()
可用于确定线程是否已被挂起。
-
isSuspended
boolean isSuspended()
确定线程是否已被调试器挂起。- 结果
-
true
如果线程当前暂停; 否则为false
。
-
isAtBreakpoint
boolean isAtBreakpoint()
确定线程是否在断点处挂起。- 结果
-
true
如果线程当前在断点处停止; 否则为false
。
-
threadGroup
ThreadGroupReference threadGroup()
返回此线程的线程组。- 结果
-
一个
ThreadGroupReference
镜像该线程在目标VM中的线程组。
-
frameCount
int frameCount() throws IncompatibleThreadStateException
返回线程当前调用堆栈中的堆栈帧数。 线程必须暂停(通常通过VM的中断)来获取此信息,并且只有线程再次恢复为止才有效。- 结果
- 一个整数帧计数
- 异常
-
IncompatibleThreadStateException
- 如果线程未暂停在目标VM中
-
frames
List<StackFrame> frames() throws IncompatibleThreadStateException
返回包含线程当前调用堆栈中的每个StackFrame
的列表。 线程必须暂停(通常通过VM的中断)来获取此信息,并且只有线程再次恢复为止才有效。- 结果
-
一个
StackFrame
的列表,当前帧首先跟随每个呼叫者的帧。 - 异常
-
IncompatibleThreadStateException
- 如果线程未暂停在目标VM中
-
frame
StackFrame frame(int index) throws IncompatibleThreadStateException
- 参数
-
index
- 所需的帧 - 结果
-
请求
StackFrame
- 异常
-
IncompatibleThreadStateException
- 如果线程未暂停在目标VM中 -
IndexOutOfBoundsException
- 如果索引大于或等于frameCount()
或为负数。
-
frames
List<StackFrame> frames(int start, int length) throws IncompatibleThreadStateException
返回一个列表,该列表包含线程当前调用堆栈的StackFrame
镜像范围。 线程必须暂停(通常通过VM的中断)来获取此信息,并且只有线程再次恢复为止才有效。- 参数
-
start
- 要检索的第一帧的索引。 索引0表示当前帧。 -
length
- 要检索的帧数 - 结果
-
一个
StackFrame
的列表,当前帧首先跟随每个呼叫者的帧。 - 异常
-
IncompatibleThreadStateException
- 如果线程未挂起在目标VM中 -
IndexOutOfBoundsException
- 如果指定的范围不在堆栈帧指标的范围内。 也就是说,如果满足以下任一条件,则抛出异常:start < 0 start >=
frameCount()
length < 0 (start+length) >frameCount()
-
ownedMonitors
List<ObjectReference> ownedMonitors() throws IncompatibleThreadStateException
返回一个包含线程拥有的每个监视器的一个ObjectReference
的列表。 如果已经输入了监视器(通过同步语句或输入到同步方法),并且没有通过Object.wait(long)
放弃监视器 。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetOwnedMonitorInfo()
确定是否支持该操作。- 结果
-
ObjectReference
对象的列表。 如果没有监视器由此线程拥有,列表的长度为零。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未挂起在目标VM中
-
ownedMonitorsAndFrames
List<MonitorInfo> ownedMonitorsAndFrames() throws IncompatibleThreadStateException
返回一个包含线程所拥有的每个监视器的一个MonitorInfo
对象的列表。 如果已经输入了监视器(通过同步语句或输入到同步方法),并且尚未通过Object.wait(long)
放弃监视器 。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetMonitorFrameInfo()
确定是否支持该操作。- 结果
-
一个
MonitorInfo
对象的列表。 如果没有监视器由此线程拥有,列表的长度为零。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未暂停在目标VM中 - 从以下版本开始:
- 1.6
-
currentContendedMonitor
ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException
返回一个ObjectReference
的监视器,如果有的话,这个线程当前正在等待。 线程可以通过进入同步方法(synchronized语句)或Object.wait(long)
等待监视器。status()
方法可用于区分前两种情况和第三种情况。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetCurrentContendedMonitor()
确定是否支持该操作。- 结果
-
对应于竞争监视器的
ObjectReference
,如果不等待监视器,则为null。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未暂停在目标VM中
-
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
。弹出框架获取的锁定在弹出时释放。 这适用于弹出的同步方法,以及其中的任何同步块。
最后块不执行。
除此线程的执行点和锁之外,状态的任何方面均受此调用的影响。 具体来说,字段的值不变,外部资源(如I / O流)也不变。 另外,目标程序可能被放置在一般程序流程中是不可能的状态; 例如,锁获取的顺序可能会受到干扰。 因此,目标程序的进行可能与用户期望的不同。
必须暂停指定的线程。
此线程的所有
StackFrame
对象都无效。此方法不会生成任何事件。
通过并包括帧的呼叫者的帧的帧都不是本地的。
并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canPopFrames()
确定是否支持该操作。- 参数
-
frame
- 堆栈框架弹出。frame
是在这个线程的调用堆栈。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作 - 请参阅VirtualMachine.canPopFrames()
。 -
IncompatibleThreadStateException
- 如果此线程未挂起。 -
IllegalArgumentException
- 如果frame
不在此线程的调用堆栈上。 -
NativeMethodException
- 如果要弹出的其中一个 框架是本机方法的框架,或者框架之前的 框架是本机的 框架 。 -
InvalidStackFrameException
- 如果frame
已经无效。 一旦这个线程被恢复,堆栈帧就不再有效了。 如果没有更多帧,也会抛出此异常。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的,请参阅VirtualMachine.canBeModified()
。 - 从以下版本开始:
- 1.4
-
forceEarlyReturn
void forceEarlyReturn(Value value) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException
强制一个方法在返回到返回语句之前返回。将早期返回的方法称为被叫方法。 被调用的方法是在调用此方法时指定线程的当前方法(由Java虚拟机规范中的“帧”部分定义)。
线程必须暂停。 当在此线程上恢复执行Java编程语言代码时,返回。 在调用此方法和恢复线程执行之间,堆栈的状态未定义。
在被叫方法中不执行进一步的指令。 具体来说,finally块不执行。 注意:这可能导致应用程序中的状态不一致。
通过调用被叫方法(如果是同步方法)获取的锁和通过在被叫方法内输入同步块获取的锁定被释放。 注意:这不适用于本机锁或java.util.concurrent.locks锁。
事件(如MethodExit)将按正常返回生成。
被调用的方法必须是非本地Java编程语言方法。 在堆叠上只有一个框架的强制返回线程会导致线程在恢复时退出。
value
参数是方法返回的值。 如果方法的返回类型为void,则值必须为VoidValue
。 对象值必须与方法返回类型分配兼容(这意味着方法返回类型必须通过封闭类的加载器加载)。 原始值必须与方法返回类型兼容,或必须可转换为变量类型而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canForceEarlyReturn()
确定操作是否受支持。- 参数
-
value
- 方法返回的值。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作 - 请参阅canForceEarlyReturn()
-
IncompatibleThreadStateException
- 如果此线程未挂起。 -
NativeMethodException
- 如果要返回的帧是本机方法的帧。 -
InvalidStackFrameException
- 如果没有帧。 -
InvalidTypeException
- 如果值的类型与方法的返回类型不匹配。 -
ClassNotLoadedException
- 如果方法的返回类型尚未通过适当的类加载器加载。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的,请参阅VirtualMachine.canBeModified()
。 - 从以下版本开始:
- 1.6
-
-