モジュール jdk.jdi
パッケージ com.sun.jdi

インタフェースThreadReference

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


    public interface ThreadReference
    extends ObjectReference
    ターゲットVMのスレッド・オブジェクトです。 ThreadReferenceは、ターゲットVMのスレッド固有の情報に追加アクセスできるObjectReferenceです。
    導入されたバージョン:
    1.3
    • フィールドの詳細

      • 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内のアプリケーションが、中断したスレッドを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()を参照してください。
        戻り値:
        保留状態の中断カウントを表す整数
      • 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を含むリストを返します。 この情報を取得するには、スレッドを中断する必要があります(通常はVMへの割り込みによって)。この情報は、スレッドが再開されると無効になります。
        戻り値:
        現在のフレームの次に呼出し側の各フレームが続くStackFrameのリスト。
        例外:
        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ミラーの範囲を含むリストを返します。 この情報を取得するには、スレッドを中断する必要があります(通常はVMへの割り込みによって)。この情報は、スレッドが再開されると無効になります。
        パラメータ:
        start - 取得する最初のフレームのインデックス。 インデックス0は現在のフレームを表す。
        length - 取得するフレーム数
        戻り値:
        現在のフレームの次に呼出し側の各フレームが続くStackFrameのリスト。
        例外:
        IncompatibleThreadStateException - ターゲットVM内でスレッドが中断されていない場合
        IndexOutOfBoundsException - 指定された範囲がスタック・フレームのインデックスの範囲内にない場合。 つまり、次のどれかがtrueである場合に例外がスローされる
            start < 0
            start >= frameCount()
            length < 0
            (start+length) > frameCount()
      • ownedMonitors

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

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

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

        List<MonitorInfo> ownedMonitorsAndFrames​()
                                          throws IncompatibleThreadStateException
        スレッドが所有する各モニターのMonitorInfoオブジェクトを含むリストを返します。 synchronized文またはsynchronizedメソッドのエントリを使用してスレッドがモニターに入ってから、Object.wait(long)によって放棄されていない場合は、そのモニターはスレッドによって所有されています。

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

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

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

        この操作は、ターゲット仮想マシンでサポートされていないことがあります。 この操作がサポートされているかどうかを確認するには、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ストリームなどの外部リソースの状態が変わることはありません。 ただし、ターゲット・プログラムの状態が、通常のプログラム・フローではあり得ない状態になる場合があります。たとえば、ロックの取得順序に混乱をきたすことが考えられます。 このため、ターゲット・プログラムが予期しない動作をする可能性があります。

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

        このスレッドのStackFrameオブジェクトはすべて無効です。

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

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

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

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

        void forceEarlyReturn​(Value value)
                       throws InvalidTypeException,
                              ClassNotLoadedException,
                              IncompatibleThreadStateException
        return文に到達する前に強制的にメソッドを復帰させます。

        早期復帰するメソッドを「被呼出しメソッド」と呼びます。 被呼出しメソッドは、「Java仮想マシン仕様」の「Frames」のセクションに定義されているとおり、このメソッドの呼出し時に、指定されたスレッドの現在のメソッドになります。

        スレッドは中断される必要があります。 メソッドの復帰は、Javaプログラミング言語のコードの実行がこのスレッド上で再開されたときに行われます。 このメソッドを呼び出してからスレッドの実行が再開される前の間のスタックの状態は未定義です。

        被呼出しメソッドでは、これ以上の命令は実行されません。 特に、最終的にブロックは実行されません。 注: これにより、アプリケーション内で整合性のない状態が発生することがあります。

        被呼出しメソッドを呼び出すことによって獲得されたロック(これがsynchronizedメソッドの場合)と、被呼出しメソッド内のsynchronizedブロックに入ることによって獲得されたロックは解除されます。 注: これは、ネイティブ・ロックやjava.util.concurrent.locksロックには適用されません。

        通常復帰の場合と同様に、MethodExitなどのイベントが生成されます。

        被呼出しメソッドは、非ネイティブのJavaプログラミング言語のメソッドとします。 スタック上にフレームが1つだけある状態でスレッドへの強制復帰を行なった場合、スレッドが再開時に終了します。

        引数valueには、メソッドが復帰する値を指定します。 メソッドの戻り値の型がvoidである場合は、この値をVoidValueにします。 オブジェクトの値は、このメソッドの戻り値の型への代入互換性を持たなければいけません。これは、このメソッドの戻り値の型を、囲むクラスのクラス・ローダーによってロードする必要があることを意味します。 プリミティブ値は、このメソッドの戻り値の型への代入互換性を持たなければいけません。つまり、情報を失わずにこの変数型に変換できる必要があります。 代入互換性の詳細は、JLSのセクション5.2を参照してください。

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

        パラメータ:
        value - メソッドが復帰する値。
        例外:
        UnsupportedOperationException - ターゲット仮想マシンがこの操作をサポートしていない場合(次を参照)。canForceEarlyReturn()
        IncompatibleThreadStateException - このスレッドが中断されていない場合。
        NativeMethodException - 復帰フレームがネイティブ・メソッドのフレームである場合。
        InvalidStackFrameException - フレームが存在しない場合。
        InvalidTypeException - 値の型がメソッドの戻り値の型に一致しない場合。
        ClassNotLoadedException - メソッドの戻り値の型が適切なクラス・ローダーによってロードされていない場合。
        VMCannotBeModifiedException - VirtualMachineが読取り専用の場合(VirtualMachine.canBeModified()を参照)。
        導入されたバージョン:
        1.6