-
- All Superinterfaces:
-
Mirror
,ObjectReference
,Value
public interface ThreadReference extends ObjectReference
来自目标VM的线程对象。 ThreadReference是ObjectReference
,可以从目标VM访问特定于线程的信息。- 从以下版本开始:
- 1.3
-
-
字段汇总
字段 变量和类型 字段 描述 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 declared in interface com.sun.jdi.ObjectReference
INVOKE_NONVIRTUAL, INVOKE_SINGLE_THREADED
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 ObjectReference
currentContendedMonitor()
返回此线程当前正在等待的监视器(如果有)的ObjectReference
。void
forceEarlyReturn(Value value)
强制方法在到达return语句之前返回。StackFrame
frame(int index)
返回线程当前调用堆栈中给定索引处的StackFrame
。int
frameCount()
返回线程当前调用堆栈中的堆栈帧数。List<StackFrame>
frames()
返回包含线程当前调用堆栈中每个StackFrame
的List。List<StackFrame>
frames(int start, int length)
返回一个List,其中包含来自线程当前调用堆栈的StackFrame
个镜像范围。void
interrupt()
除非线程已被调试器暂停,否则会中断此线程。boolean
isAtBreakpoint()
确定线程是否在断点处挂起。boolean
isSuspended()
确定调试器是否已挂起线程。String
name()
返回此线程的名称。List<ObjectReference>
ownedMonitors()
为线程拥有的每个监视器返回包含ObjectReference
的List。List<MonitorInfo>
ownedMonitorsAndFrames()
返回包含线程拥有的每个监视器的MonitorInfo
对象的List。void
popFrames(StackFrame frame)
流行堆栈帧。void
resume()
恢复此主题。int
status()
返回线程的状态。void
stop(ObjectReference throwable)
使用异步异常停止此线程。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()或JVM_Sleep()- 另请参见:
- 常数字段值
-
THREAD_STATUS_MONITOR
static final int THREAD_STATUS_MONITOR
线程正在等待java监视器- 另请参见:
- 常数字段值
-
THREAD_STATUS_WAIT
static final int THREAD_STATUS_WAIT
线程正在等待 - 调用了Object.wait()或JVM_MonitorWait()- 另请参见:
- 常数字段值
-
THREAD_STATUS_NOT_STARTED
static final int THREAD_STATUS_NOT_STARTED
线程尚未启动- 另请参见:
- 常数字段值
-
-
方法详细信息
-
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()
。
-
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
的List。 必须暂停线程(通常通过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
返回一个List,其中包含来自线程当前调用堆栈的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
的List。 监视器由线程拥有(如果已经输入(通过synchronized语句或进入同步方法)并且尚未通过Object.wait()
放弃)。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetOwnedMonitorInfo()
确定是否支持该操作。- 结果
-
一个
ObjectReference
对象的列表。 如果此线程没有监视器,则列表的长度为零。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未在目标VM中挂起
-
ownedMonitorsAndFrames
List<MonitorInfo> ownedMonitorsAndFrames() throws IncompatibleThreadStateException
返回包含线程拥有的每个监视器的MonitorInfo
对象的List。 监视器由线程拥有(如果已经输入(通过synchronized语句或进入同步方法)并且尚未通过Object.wait()
放弃。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetMonitorFrameInfo()
确定是否支持该操作。- 结果
-
一个
MonitorInfo
对象的列表。 如果此线程没有监视器,则列表的长度为零。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未在目标VM中挂起 - 从以下版本开始:
- 1.6
-
currentContendedMonitor
ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException
返回此线程当前正在等待的监视器(如果有)的ObjectReference
。 线程可以通过进入同步方法(同步语句或Object.wait()
)来等待监视器。status()
方法可用于区分前两种情况和第三种情况。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canGetCurrentContendedMonitor()
确定是否支持该操作。- 结果
-
对应于竞争监视器的
ObjectReference
,如果不等待监视器则为null。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作。 -
IncompatibleThreadStateException
- 如果线程未在目标VM中挂起
-
popFrames
void popFrames(StackFrame frame) throws IncompatibleThreadStateException
流行堆栈帧。所有直到并包括
frame
帧都从堆栈中弹出。 参数frame
之前的帧将成为当前帧。执行此操作后,此线程将在创建
frame
的目标方法的invoke指令处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
强制方法在到达return语句之前返回。将提前返回的方法称为被调用方法。 被调用的方法是调用此方法时指定线程的当前方法(由Java虚拟机规范中的“帧”部分定义)。
线程必须暂停。 在此线程上恢复执行Java编程语言代码时发生返回。 在调用此方法和恢复线程执行之间,堆栈的状态是未定义的。
在被调用的方法中不执行进一步的指令。 具体而言,最后不执行块。 注意:这可能会导致应用程序中的状态不一致。
通过调用被调用方法获得的锁(如果它是同步方法)和通过在被调用方法中输入同步块而获得的锁被释放。 注意:这不适用于本机锁或java.util.concurrent.locks锁。
诸如MethodExit之类的事件将在正常返回时生成。
被调用的方法必须是非本机Java编程语言方法。 强制在堆栈上只有一个帧的线程上返回会导致线程在恢复时退出。
value
参数是方法返回的值。 如果方法的返回类型为void,则value必须为VoidValue
。 对象值必须与方法返回类型兼容(这意味着必须通过封闭类的类加载器加载方法返回类型)。 原始值必须是与方法返回类型兼容的赋值,或者必须可转换为变量类型而不会丢失信息。 有关分配兼容性的更多信息,请参阅JLS第5.2节。并非所有目标虚拟机都支持此操作。 使用
VirtualMachine.canForceEarlyReturn()
确定是否支持该操作。- 参数
-
value
- 方法返回的值。 - 异常
-
UnsupportedOperationException
- 如果目标虚拟机不支持此操作 - 请参阅canForceEarlyReturn()
-
IncompatibleThreadStateException
- 如果此线程未挂起。 -
NativeMethodException
- 如果要返回的帧是本机方法的帧。 -
InvalidStackFrameException
- 如果没有框架。 -
InvalidTypeException
- 如果值的类型与方法的返回类型不匹配。 -
ClassNotLoadedException
- 如果尚未通过适当的类加载器加载方法的返回类型。 -
VMCannotBeModifiedException
- 如果VirtualMachine是只读的 - 请参阅VirtualMachine.canBeModified()
。 - 从以下版本开始:
- 1.6
-
-