19

IntelliJ IDEA 是否提供线程调试?也就是说 - Netbeans 允许您调试多个线程,并在这些断点处停止(自动)。然而,我似乎在 IntelliJ 中得到的只是“线程转储”,这似乎是一种手动分析,以及当我单击“线程转储”时拍摄的快照。

有什么我想念的吗?我用谷歌搜索并没有找到足够的信息来提供帮助。

4

5 回答 5

28

我想你可以。我通过设置暂停策略通过断点暂停了线程。这将暂停正在执行这段代码的线程。如果您有多个线程,那么我认为他们会继续进行。

引用暂停政策

  • 商品描述
  • All :当断点被命中时,所有线程都被挂起
  • 线程:当断点被命中时,断点所在的线程被挂起。
  • 无:没有线程被挂起。
于 2012-09-25T10:35:43.727 回答
7

你有一个很好的Threads视野。

按下小齿轮,您将看到所有活动线程。

在此处输入图像描述

在每个断点上,您都可以设置暂停策略。您可以将Thread替代设置为所有断点的默认值,也可以在每个断点上单独设置它们。

在此处输入图像描述

于 2012-09-25T10:38:23.120 回答
3

对我来说,不访问线程的问题仍然存在。我为所有人设置了刹车点。并将刹车点放在调用方法中。我注意到的是,当我调用 run() 而不是 start() 时,正在访问新线程中的方法。只是想知道为什么,AFAIK start() 方法应该调用 run()。尽管如此,即使我调用 .start(),线程的输出也会发生,但从不访问它。

于 2013-09-16T23:01:44.810 回答
0

对我来说,问题是似乎存在竞争条件,在断点后恢复线程并在 IntelliJ 中评估断点。

我的短期工作是在生成线程之前不设置断点。如果我不这样做,run()call()中的前几个断点就会丢失。

于 2015-07-30T01:41:09.583 回答
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 回答