Java Debug Interface

com.sun.jdi
インタフェース ThreadReference

すべてのスーパーインタフェース:
Mirror, ObjectReference, Value

public interface ThreadReference
extends ObjectReference

ターゲット VM のスレッドオブジェクトです。ThreadReference は、ターゲット VM のスレッド固有の情報に追加アクセスできる ObjectReference です。

導入されたバージョン:
1.3

フィールドの概要
static int THREAD_STATUS_MONITOR
          スレッドは Java モニターを待機中です。
static int THREAD_STATUS_NOT_STARTED
          スレッドは開始されていません。
static int THREAD_STATUS_RUNNING
          スレッドは実行可能です。
static int THREAD_STATUS_SLEEPING
          スレッドはスリープ中です。
static int THREAD_STATUS_UNKNOWN
          スレッドの状態が不明です。
static int THREAD_STATUS_WAIT
          スレッドは待機中です。
static int THREAD_STATUS_ZOMBIE
          スレッドは実行を完了しました。
 
インタフェース com.sun.jdi.ObjectReference から継承されたフィールド
INVOKE_NONVIRTUAL, INVOKE_SINGLE_THREADED
 
メソッドの概要
 ObjectReference currentContendedMonitor()
          このスレッドが現在モニターを待機している場合は、そのモニターへの ObjectReference を返します。
 StackFrame frame(int index)
          スレッドの現在の呼び出しスタック内の指定されたインデックスで StackFrame を返します。
 int frameCount()
          スレッドの現在の呼び出しスタック内のスタックフレーム数を返します。
 List<StackFrame> frames()
          スレッドの現在の呼び出しスタック内にあるすべての StackFrame の List を返します。
 List<StackFrame> frames(int start, int length)
          スレッドの現在の呼び出しスタックにある StackFrame ミラーの範囲の List を返します。
 void interrupt()
          デバッガによってスレッドが中断されていない場合、このスレッドに割り込みます。
 boolean isAtBreakpoint()
          スレッドがブレークポイントで中断しているかどうかを判定します。
 boolean isSuspended()
          デバッガによってスレッドが中断されているかどうかを判定します。
 String name()
          このスレッドの名前を返します。
 List<ObjectReference> ownedMonitors()
          スレッドが所有する各モニターへの ObjectReference の List を返します。
 void popFrames(StackFrame frame)
          スタックフレームをポップします。
 void resume()
          このスレッドを再開します。
 int status()
          スレッドの状態を返します。
 void stop(ObjectReference throwable)
          非同期の例外を使用してこのスレッドを停止します。
 void suspend()
          このスレッドを中断します。
 int suspendCount()
          このスレッドの保留状態の中断回数を返します。
 ThreadGroupReference threadGroup()
          このスレッドのスレッドグループを返します。
 
インタフェース com.sun.jdi.ObjectReference から継承されたメソッド
disableCollection, enableCollection, entryCount, equals, getValue, getValues, hashCode, invokeMethod, isCollected, owningThread, referenceType, setValue, uniqueID, waitingThreads
 
インタフェース com.sun.jdi.Value から継承されたメソッド
type
 
インタフェース com.sun.jdi.Mirror から継承されたメソッド
toString, virtualMachine
 

フィールドの詳細

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 再開メソッドの 1 つを使って再開されるまで中断状態を維持することが保証されます。 ターゲット VM 内のアプリケーションが、中断したスレッドを java.lang.Thread#resume を使って再開することはできません。

例外:
VMCannotBeModifiedException - 仮想マシンが読み取り専用の場合は、VirtualMachine.canBeModified() を参照

resume

void resume()
このスレッドを再開します。このスレッドの以前に中断された原因が suspend()VirtualMachine.suspend()、SUSPEND_ALL イベント、または SUSPEND_EVENT_THREAD イベントのいずれでもない場合は、このメソッドを呼び出しても再開できません。これらのいずれかによって中断されたスレッドの場合は、このスレッドの保留状態の中断カウントが減ります。カウントがゼロになると、スレッドの実行が継続されます。注: 中断の原因となったイベントからスレッドを再開するには、通常、EventSet.resume() を使用します。

例外:
VMCannotBeModifiedException - 仮想マシンが読み取り専用の場合は、VirtualMachine.canBeModified() を参照

suspendCount

int suspendCount()
このスレッドの保留状態の中断回数を返します。カウントされる中断については、suspend() を参照してください。

戻り値:
保留状態の中断カウントを表す整数

stop

void stop(ObjectReference throwable)
          throws InvalidTypeException
非同期の例外を使用してこのスレッドを停止します。ターゲット VM 内のデバッガスレッドは、指定された Throwable オブジェクトを使用してこのスレッドを停止します。

パラメータ:
throwable - スローする非同期の例外
例外:
InvalidTypeException - throwable がターゲット VM 内の java.lang.Throwable のインスタンスでない場合
VMCannotBeModifiedException - 仮想マシンが読み取り専用の場合は、VirtualMachine.canBeModified() を参照
関連項目:
Thread.stop(Throwable)

interrupt

void interrupt()
デバッガによってスレッドが中断されていない場合、このスレッドに割り込みます。

例外:
VMCannotBeModifiedException - 仮想マシンが読み取り専用の場合は、VirtualMachine.canBeModified() を参照
関連項目:
Thread.interrupt()

status

int status()
スレッドの状態を返します。スレッドが中断していない場合は、スレッドの現在の状態を返します。スレッドが中断している場合は、中断前のスレッドの状態を返します。中断前のスレッドの状態を取得できない場合は、THREAD_STATUS_UNKNOWN を返します。スレッドが中断しているかどうかを判定するには、isSuspended() を使用します。

戻り値:
THREAD_STATUS_UNKNOWNTHREAD_STATUS_ZOMBIETHREAD_STATUS_RUNNINGTHREAD_STATUS_SLEEPINGTHREAD_STATUS_MONITORTHREAD_STATUS_WAITTHREAD_STATUS_NOT_STARTED のいずれか

isSuspended

boolean isSuspended()
デバッガによってスレッドが中断されているかどうかを判定します。

戻り値:
スレッドが現在中断している場合は true、そうでない場合は false

isAtBreakpoint

boolean isAtBreakpoint()
スレッドがブレークポイントで中断しているかどうかを判定します。

戻り値:
スレッドがブレークポイントで現在停止している場合は true、そうでない場合は false

threadGroup

ThreadGroupReference threadGroup()
このスレッドのスレッドグループを返します。

戻り値:
ターゲット VM 内のこのスレッドのスレッドグループをミラー化する ThreadGroupReference

frameCount

int frameCount()
               throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内のスタックフレーム数を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。この情報は、スレッドが再開されると無効になります。

戻り値:
フレームのカウントを表す整数
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

frames

List<StackFrame> frames()
                        throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内にあるすべての StackFrame の List を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。この情報は、スレッドが再開されると無効になります。

戻り値:
現在のフレームの次に呼び出し側の各フレームが続く StackFrame の List
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

frame

StackFrame frame(int index)
                 throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内の指定されたインデックスで StackFrame を返します。インデックス 0 は、現在のフレームです。0 より大きいインデックスの場合は、呼び出し側のフレームを示します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。この情報は、スレッドが再開されると無効になります。

パラメータ:
index - 目的のフレーム
戻り値:
要求された StackFrame
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合
IndexOutOfBoundsException - インデックスが frameCount() 以上の場合、または負の場合

frames

List<StackFrame> frames(int start,
                        int length)
                        throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタックにある StackFrame ミラーの範囲の List を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。この情報は、スレッドが再開されると無効になります。

パラメータ:
start - 取得する最初のフレームを表すインデックス。インデックス 0 は現在のフレームを表す
length - 取得するフレーム数
戻り値:
現在のフレームの次に呼び出し側の各フレームが続く StackFrame の List
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合
IndexOutOfBoundsException - 指定された範囲がスタックフレームインデックス範囲に収まっていない場合。つまり、以下のどれかが true である場合に例外がスローされる
    start < 0
    start >= frameCount()
    length < 0
    (start+length) > frameCount()

ownedMonitors

List<ObjectReference> ownedMonitors()
                                    throws IncompatibleThreadStateException
スレッドが所有する各モニターへの ObjectReference の List を返します。synchronized 文または synchronized メソッドのエントリを使用してスレッドがモニターに入ってから、モニターが Object.wait(long) によって破棄されていない場合は、そのモニターはスレッドによって所有されています。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetOwnedMonitorInfo() を使用してください。

戻り値:
ObjectReference オブジェクトの List。このスレッドによってモニターが所有されていない場合は、このリストの長さはゼロになる
例外:
UnsupportedOperationException - ターゲット仮想マシンがこの操作をサポートしていない場合
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

currentContendedMonitor

ObjectReference currentContendedMonitor()
                                        throws IncompatibleThreadStateException
このスレッドが現在モニターを待機している場合は、そのモニターへの ObjectReference を返します。スレッドは、synchronized メソッドのエントリ、synchronized 文、または Object.wait(long) を使用して、モニターを待機している可能性があります。最初の 2 つの場合と Object.wait(long) による場合を識別するには、status() メソッドを使用します。

この操作は、ターゲット VM でサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetCurrentContendedMonitor() を使用してください。

戻り値:
競合するモニターに対応する ObjectReference。スレッドがモニターを待機していない場合は null
例外:
UnsupportedOperationException - ターゲット仮想マシンがこの操作をサポートしていない場合
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

popFrames

void popFrames(StackFrame frame)
               throws IncompatibleThreadStateException
スタックフレームをポップします。

パラメータ frame に指定されたフレームとそれまでのすべてのフレームが、スタックからポップされます。 frame の 1 つ前のフレームが、現在のフレームになります。

この操作が終了すると、このスレッドは frame を作成したターゲットメソッドの呼び出し命令で中断状態になります。この呼び出し命令に移動すれば、frame のメソッドを再実行することができます。

オペランドスタックは復元されますが、前回のメソッド呼び出し時に実行された引数に対する変更は取り消されません。たとえば、次のようなメソッド foo を考えます。

 void foo(int x) { System.out.println("Foo: " + x); x = 4; System.out.println("pop here"); } 
このメソッドを foo(7) として呼び出した後、foo を 2 番目の println の位置でポップして再開した場合、「Foo: 4」と出力されます。

フレームに設定されていたロックは、そのフレームがポップされると解除されます。このことは、ポップされる同期メソッドおよびその内部のすべての同期ブロックにも、同様に当てはまります。

最終的に、ブロックは実行されません。

このメソッド呼び出しによって、このスレッドの実行ポイントとロック以外の状態が変わることはありません。具体的には、フィールドの値や I/O ストリームなどの外部リソースの状態が変わることはありません。ただし、ターゲットプログラムの状態が、通常のプログラムフローではあり得ない状態になる場合があります。たとえば、ロックの取得順序に混乱をきたすことが考えられます。このため、ターゲットプログラムが予期しない動作をする可能性があります。

指定されるスレッドは、中断されている必要があります。

このスレッドの StackFrames はすべて無効です。

このメソッドによって生成されるイベントはありません。

frame の呼び出し側のフレームとそれまでのフレームはどれも、ネイティブであってはいけません。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canPopFrames() を使用してください。

パラメータ:
frame - ポップするスタックフレーム。frame はこのスレッドの呼び出しスタック上に存在する必要がある
例外:
UnsupportedOperationException - ターゲット仮想マシンがこの操作をサポートしていない場合。VirtualMachine.canPopFrames() を参照
IncompatibleThreadStateException - このスレッドが中断されていない場合
IllegalArgumentException - frame がこのスレッドの呼び出しスタック上に存在しない場合
NativeMethodException - ポップされたフレームの中にネイティブメソッドに対するものが存在する場合、または frame の 1 つ前のフレームがネイティブである場合
InvalidStackFrameException - frame が無効になった場合。このスレッドがいったん再開されると、そのスタックフレームは有効でなくなる。フレームがこれ以上存在しない場合はこの例外もスローされる
VMCannotBeModifiedException - 仮想マシンが読み取り専用の場合は、VirtualMachine.canBeModified() を参照
導入されたバージョン:
1.4

Java Debug Interface