IntelliJ IDEAはスレッドデバッグを提供しますか?つまり、Netbeansを使用すると、複数のスレッドをデバッグし、それらのブレークポイントで(自動的に)停止できます。ただし、IntelliJで取得しているのは「スレッドダンプ」だけです。 "、これは手動の分析のようで、[スレッドダンプ]をクリックしたときに取得したスナップショットです。
足りないものはありますか?私はグーグルで検索しましたが、支援するのに十分な情報が見つかりませんでした。
できると思います。 suspend policy を設定して、ブレークポイントを介してスレッドを一時停止しました。これにより、このコードを実行しているスレッドが一時停止されます。あなたが複数のスレッドを持っているなら、私はそれらが続くと思います。
一時停止ポリシーを引用するには
素敵なThreads
ビューが利用可能です。
小さな歯車を押すと、すべてのアクティブなスレッドが表示されます。
また、各ブレークポイントでサスペンドポリシーを設定できます。 Thread
代替をすべてのブレークポイントのデフォルトにするか、各ブレークポイントに個別に設定することができます。
私にとって、スレッドにアクセスしないという問題はまだ発生しています。私はすべてにブレーキポイントを設定しました。そして、呼び出しメソッド内にブレーキポイントを配置します。私が気付いたのは、run()を呼び出したときに、start()ではなく、新しいスレッドのメソッドにアクセスしていることです。なぜだろうと思っているのですが、start()メソッドはrun()を呼び出す必要があります。それでも、.start()を呼び出してもスレッドからの出力は発生しますが、アクセスすることはありません。
あなたが抱えている問題は、メインスレッド(テスト自体)が最後に到達したために、子スレッドが予想よりも早く閉じられていることだと思います。
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はあなたが探しているものかもしれません。
それが誰かを助けるかもしれないことを願っています!
私にとっての問題は、IntelliJでブレークポイントの後にスレッドを再開し、ブレークポイントを評価する競合状態があるように見えることでした。
私の短期的な回避策は、スレッドを生成する直前にブレークポイントを設定しないことでした。これを行わないと、run()またはcall()の最初のいくつかのブレークポイントが失われます。