7

メイン クラス RunTest と興味深いクラス QueueListener を使用して、Eclipse でマルチスレッド Java コードをデバッグしている場合。

仮定:

  • RunTest が初期化されると、QueueListener がバックグラウンドで実行されます。
  • RunTest が終了すると - QueueListener が終了します
  • RunTest には単一のメソッドがあり、その中にブレークポイントがあります
  • ブレークポイントを持つ QueueListener に単一のメソッドがあります
  • QueueListener は何度でも実行できます
  • RunTest は実行ごとに 1 回だけ実行されます (親クラス)

Eclipse でデバッグすると、両方のブレークポイントが表示されます。しかし、Eclipse は RunTest を優先し、デバッガーでそのスレッドを選択して手動で QueueListener に切り替える必要があり、これを何度も繰り返します。

私が QueueListener にもっと興味を持っていることを Eclipse に伝える方法はありますか?

4

2 に答える 2

3

ThreadEventHandler答えは、メソッド内の Eclipse ソース コードにあります。以下のように、中断されたスレッドのキューがあります。

/**
 * Queue of suspended threads to choose from when needing
 * to select a thread when another is resumed. Threads
 * are added in the order they suspend.
 */
private Set fThreadQueue = new LinkedHashSet();

さらに下では、ブレークポイントに到達するたびに、中断されたスレッドがこのキューに追加されます。

protected void handleSuspend(DebugEvent event) {
   ...
   queueSuspendedThread(event);
   ...
}

次に中断されたスレッドを取得する方法は次のとおりです。

protected synchronized IThread getNextSuspendedThread() {
    if (!fThreadQueue.isEmpty()) {
        return (IThread) fThreadQueue.iterator().next();
    }
    return null;
}

したがって、答えはノーです。順序を制御することはできません。厳密には、各スレッドがブレークポイントに到達し、基礎となるキューに追加される順序になります。

于 2013-03-28T13:40:02.720 に答える
0

関連する優先度はありませんが、これはアプリケーションのタイミング動作に依存します。おそらく、2 つのブレークポイントは非常に短い時間でヒットしますが、常に同じ順序でヒットします。そして、Eclipseは常にそのうちの1つだけのエディターを開きます(そしてスレッドにスクロールします)(選択した戦略は正確にはわかりませんが、発生した最初のブレークポイントを推測します)。

マルチスレッド アプリケーションをデバッグし、数秒ごとにブレークポイントをヒットするときに、エディター/ビューを常に変更したくないと思いませんか?

于 2013-03-28T13:27:34.980 に答える