IntelliJ IDEA是否提供线程调试?也就是说 - Netbeans允许您调试多个线程,并在这些断点处自动停止(自动)。然而,我似乎进入IntelliJ的所有内容都是“线程转储”,这似乎是一个手动分析,当我点击'Thread Dump'时拍摄的快照。
有什么我想念的吗? 我已经谷歌了,没有找到足够的信息来协助。
答案 0 :(得分:25)
我想你可以。我通过设置suspend policy通过断点暂停了线程。这将暂停执行此代码的线程。如果你有多个线程,那么我认为它们会继续。
引用暂停政策
答案 1 :(得分:6)
您有一个很好的Threads
视图。
按下小齿轮,您将看到所有活动的螺纹。
在每个断点上,您可以设置暂停策略。您可以将Thread
替代值作为所有断点的默认值,也可以在每个断点上单独设置它们。
答案 2 :(得分:3)
对我来说,没有访问线程的问题仍然存在。我为所有人设置制动点。并将制动点放在调用方法中。我注意到,当我调用run()而不是start()时,新线程中的方法被访问。只是想知道为什么,AFAIK的start()方法应该调用run()。然而,即使我调用.start(),也会发生线程输出,但从不访问它。
答案 3 :(得分:0)
对我来说,问题是在断点之后恢复线程并在IntelliJ中评估断点似乎存在竞争条件。
我的短期工作是在我产生线程之前没有设置断点。如果我不这样做,则会错过 run()或 call()中的前几个断点。
答案 4 :(得分: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可能就是你想要的。
希望它可以帮助某人!