19

IntelliJ IDEA はスレッドデバッグを提供しますか? つまり、Netbeans を使用すると、複数のスレッドをデバッグし、それらのブレークポイントで (自動的に) 停止することができます。ただし、IntelliJ で取得しているように見えるのは「スレッド ダンプ」だけです。これは、手動の分析であり、「スレッド ダンプ」をクリックしたときに取得したスナップショットのようです。

足りないものはありますか?Google で検索しましたが、支援するのに十分な情報が見つかりませんでした。

4

5 に答える 5

28

できると思います。中断ポリシーを設定して、ブレークポイントを介してスレッドを中断しました。これにより、このコードを実行しているスレッドが中断されます。複数のスレッドがある場合は、それらが続行されると思います。

一時停止ポリシーを引用するには

  • アイテム説明
  • All : ブレークポイントに到達すると、すべてのスレッドが中断されます
  • Thread : ブレークポイントにヒットすると、ブレークポイントにヒットしたスレッドが中断されます。
  • なし: スレッドは中断されません。
于 2012-09-25T10:35:43.727 に答える
7

素敵なThreads景色をご覧いただけます。

小さな歯車を押すと、すべてのアクティブなスレッドが表示されます。

ここに画像の説明を入力

また、各ブレークポイントでサスペンド ポリシーを設定できます。代替をすべてのブレークポイントのデフォルトにすることも、Threadブレークポイントごとに個別に設定することもできます。

ここに画像の説明を入力

于 2012-09-25T10:38:23.120 に答える
3

私にとって、スレッドにアクセスできないという問題はまだ発生しています。すべてにブレーキポイントを設定しました。そして、呼び出しメソッド内にブレークポイントを配置します。私が気づいたのは、run() を呼び出すが start() を呼び出さないときに、新しいスレッドのメソッドがアクセスされていることです。なぜ、私の知る限り、start() メソッドは run() を呼び出す必要があるのか​​ 疑問に思っています。それにもかかわらず、スレッドからの出力は、.start() を呼び出しても発生しますが、アクセスすることはありません。

于 2013-09-16T23:01:44.810 に答える
0

あなたが抱えている問題は、メインスレッド(テスト自体)が最後に到達するため、子スレッドが予想よりも早く閉じられていることだと思います.

Thread.start() を実行すると非同期呼び出しが開始されることに注意してください。Junit を使用してテストを実行している場合、この呼び出しの後、テストの最後まで実行が継続され、最後に到達するとすぐに、内部で開始したスレッドをシャットダウンします。

したがって、次のようなものがある場合:

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         Assert.assertTrue(didIGetIt);
17.     }
18. }

run() 内のコードの前に Assert を実行し、テストに失敗します。

ただし、単純なスリープを追加すると、メイン スレッドを停止してデバッグし、メイン スレッドが停止する前に必要なことを行うことができます。

01. import org.junit.Assert;
02. import org.junit.Test;
03. public class ThreadTest {
04.     static boolean didIGetIt = false;
05.     @Test
06.     public void testThread() throws InterruptedException {
07.         Thread myThread = new Thread(new Runnable() {
08.             @Override
09.             public void run() {
10.                 System.out.println("I am an asynchronous task");
11.                 System.out.println("and JUnit won't wait for me to finish my job!");
12.                 didIGetIt = true;
13.             }
14.         });
15.         myThread.start();
16.         System.out.println("Let's wait for child threads to finish");
17.         Thread.sleep(5000);
18.         Assert.assertTrue(didIGetIt);
19.     }
20. }

確かにそれを行うより良い方法がありますが、 Thread.sleep が探しているものかもしれません。

それが誰かを助けることを願っています!

于 2015-07-30T18:05:27.947 に答える