IntelliJ线程调试

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

有什么我想念的吗? 我已经谷歌了,没有找到足够的信息来协助。

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

引用暂停政策

  • 商品描述
  • 全部:当命中断点时,所有线程都被挂起
  • 线程:当命中断点时,挂起断点的线程被挂起。
  • 无:没有线程被暂停。

你有一个很好的Threads视图。

按下小齿轮,您将看到所有活动的螺纹。

在此处输入图像描述

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

在此处输入图像描述

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

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

我的短期工作是在我产生线程之前没有设置断点。 如果我不这样做,则会错过run()call()中的前几个断点。

我认为你遇到的问题是子线程比你预期的更早关闭,因为主线程( 测试本身 )到达终点。

请记住,当您执行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可能就是你要找的东西。

希望它可以帮助别人!