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 frames()
          スレッドの現在の呼び出しスタック内にあるすべての StackFrame の List を返します。
 List frames(int start, int length)
          スレッドの現在の呼び出しスタックにある StackFrame ミラーの範囲の List を返します。
 void interrupt()
          このスレッドに割り込みます。
 boolean isAtBreakpoint()
          スレッドがブレークポイントで中断しているかどうかを判定します。
 boolean isSuspended()
          デバッガによってスレッドが中断されているかどうかを判定します。
 String name()
          このスレッドの名前を返します。
 List 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

public static final int THREAD_STATUS_UNKNOWN
スレッドの状態が不明です。

関連項目:
定数フィールド値

THREAD_STATUS_ZOMBIE

public static final int THREAD_STATUS_ZOMBIE
スレッドは実行を完了しました。

関連項目:
定数フィールド値

THREAD_STATUS_RUNNING

public static final int THREAD_STATUS_RUNNING
スレッドは実行可能です。

関連項目:
定数フィールド値

THREAD_STATUS_SLEEPING

public static final int THREAD_STATUS_SLEEPING
スレッドはスリープ中です。Thread.sleep() または JVM_Sleep() が呼び出されました。

関連項目:
定数フィールド値

THREAD_STATUS_MONITOR

public static final int THREAD_STATUS_MONITOR
スレッドは Java モニターを待機中です。

関連項目:
定数フィールド値

THREAD_STATUS_WAIT

public static final int THREAD_STATUS_WAIT
スレッドは待機中です。Thread.wait() または JVM_MonitorWait() が呼び出されました。

関連項目:
定数フィールド値

THREAD_STATUS_NOT_STARTED

public static final int THREAD_STATUS_NOT_STARTED
スレッドは開始されていません。

関連項目:
定数フィールド値
メソッドの詳細

name

public String name()
このスレッドの名前を返します。

戻り値:
スレッド名を含む文字列

suspend

public void suspend()
このスレッドを中断します。スレッドは resume() を使用して再開するか、VirtualMachine.resume() を使用してほかのスレッドから再開できます。

Thread.suspend() と異なり、Virtual Machine の中断と各スレッドの中断はどちらもカウントされます。スレッドは、再実行される前に、(resume() または resume() によって) 中断された回数と同じ回数だけ再開する必要があります。

このメソッドを使用して単一のスレッドを中断する場合、Thread.suspend() を使用する場合と同様の注意が必要です。中断されたスレッドが保持しているモニターが、別の実行中のスレッドから要求された場合、ターゲット VM 内で (少なくとも中断されたスレッドが再開されるまでの間) デッドロックが発生する可能性があります。

中断されたスレッドは、上記の JDI 再開メソッドのいずれかを使用して再開するまで、中断状態が保証されます。ターゲット VM 内のアプリケーションから Thread.resume() を使用して、中断されたスレッドを再開することはできません。


resume

public void resume()
このスレッドを再開します。このスレッドが suspend() または VirtualMachine.suspend() によって中断されていない場合は、このメソッドを呼び出しても再開できません。これらのいずれかによって中断されたスレッドの場合は、このスレッドの保留状態の中断カウントが減ります。カウントが 0 になると、スレッドの実行が継続されます。


suspendCount

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

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

stop

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

パラメータ:
throwable - スローする非同期の例外
例外:
InvalidTypeException - throwable がターゲット VM 内の java.lang.Throwable のインスタンスでない場合
関連項目:
Thread.stop(Throwable)

interrupt

public void interrupt()
このスレッドに割り込みます。

関連項目:
Thread.interrupt()

status

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

戻り値:
THREAD_STATUS_UNKNOWNTHREAD_STATUS_ZOMBIETHREAD_STATUS_RUNNINGTHREAD_STATUS_SLEEPINGTHREAD_STATUS_MONITORTHREAD_STATUS_WAIT、または THREAD_STATUS_NOT_STARTED のいずれか

isSuspended

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

戻り値:
スレッドが現在中断している場合は true、それ以外の場合は false

isAtBreakpoint

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

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

threadGroup

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

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

frameCount

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

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

frames

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

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

frame

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

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

frames

public List 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

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

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

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

currentContendedMonitor

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

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

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

popFrames

public 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 とそれ以降のフレームはどれも、ネイティブであってはいけません。

この操作は、すべてのターゲット Virtual Machine でサポートされるわけではありません。この操作がサポートされているかどうかを確認するには、VirtualMachine.canPopFrames() を使用してください。

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

Java Debug Interface