10

次のように、ブレークポイントを使用して次のコードを実行しようとしています。

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Starting"); //breakpoint here
        }
    }).start();

    int i = 10;
    i++; //breakpoint here

このコードを実行すると、i++ ブレークポイントのみがヒットします...それを削除すると、他のスレッドのブレークポイントが正しくヒットします。なぜこの奇妙な動作が発生するのですか?

4

3 に答える 3

10

これはhttp://www.jetbrains.com/idea/webhelp/breakpoints-2.htmlに記載されています:

IntelliJ IDEA がブレークポイントで停止しない場合があります。次の状況を考えてみましょう: クラスの異なるメソッドに 2 つのブレークポイントが設定されており、サスペンド ポリシーが [すべて] に設定されています。ブレークポイントの 1 つに到達すると、いくつかのステップ アクションが実行されます。ステップ実行時に別のスレッドが 2 番目のブレークポイントに到達した場合、IntelliJ IDEA はそこで停止しません。

コード例をコピーして、状況を再現しました。案の定、ドキュメントにあるように、i++ブレークポイントで停止した後、F8 (ステップ オーバー) を押すと、プログラムは他のブレークポイントで停止しません。しかし、F9 (再開) を押すと、プログラム別のブレークポイントで再び停止します。

于 2013-08-22T08:51:11.193 に答える
3

この問題が発生したばかりで、これに遭遇した他の人のために、この動作の理由と変更方法を次に示します。

ドロンが指摘したように、これに関するドキュメントがあります。ただし、注意すべき重要なことは、デフォルトでは、ブレークポイントに到達すると JVM 内のすべてのスレッドが中断されることです。

あなたが期待していること (そして私が期待していたこと) は、ブレークポイントを持つスレッドのみが中断されることです。

これはあなたが望むものではありませんし、私が望んだものでもありません。

この動作を変更する (および目的の動作を提供する)。

1) 余白を左クリックしてブレークポイントを作成します。
2) ctrl+shift+F8 を押します (ブレークポイント メニューを表示します)。
3) ブレークポイントを選択します。そのオプションが表示されます。
4) 「サスペンド」がチェックされ、「スレッド」ラジオオプションが選択されていることを確認します。
5) 「デフォルトにする」ボタンをクリックします。

実行すると、さまざまなスレッドのブレークポイントがヒットすることがわかります。

于 2015-06-27T07:48:31.600 に答える
0

他のスレッドはバックグラウンドで実行するようにスケジュールされており、OSスレッドスケジューラがそれを実行することを決定すると、実行されます。ブレークポイントがある場合は、ヒットします。

コードを実行しただけでは必ずしも開始されないため、のブレークポイントi++はすぐにヒットします。

于 2013-03-08T16:30:37.980 に答える