java 如何在intellij中进行单步调试时停留在当前线程上

2sbarzqh  于 2022-12-10  发布在  Java
关注(0)|答案(4)|浏览(139)

在intellij中调试多线程代码时,更具体地说,在线程内部单步执行时...
设定:

@Override
            public
            void run() {
                while (true) {
                  System.err.println("1" + get());  <-- breakpoint
                  System.err.println("2" + get());
                  System.err.println("3" + get());
                }
            }

            public String get() {
               return "x";
            }

我有6个线程,都运行上面的代码。
Intellij不断更改我所在的当前线程,这意味着当我对T1发出“Step over”(F8)命令时,调试器将把焦点转到T2。我希望在调试时 * 停留在T1 *--因此要产生结果:

T1: 1x
T1: 2x
T1: 3x
T1: 1x
T1: 2x

然后,让我们切换到另一个线程T2。

T2: 1x
T2: 2x
T2: 3x
T2: 1x
T2: 2x
T2: 3x

然后,回到T1:

T1: 3x  (it picks back up from where it left off)

相反,我得到的是:

T1: 1x
T3: 1x
T5: 1x
T1: 2x
T2: 1x
T3: 2x
T1: 3x
etc.

它是无序的,而且一点也不直观。
如果我想有我预期的行为,我必须做以下几点:
切换至T1:

T1: 1x

切换至T1:

T1: 2x

切换至T1:

T1: 3x

切换至T2:

T2: 1x

切换至T2:

T2: 2x

切换至T2:

T2: 3x

切换至T1:

T1: 1x

等等。
我一直在寻找一种方法来防止这种情况,但我没有找到解决方案,我发现的唯一方法(保持在我当前的线程中步进)是每次步进时用鼠标选择它。
问题是:如何防止智能更改我所在的线程?
编辑:我应该指出的是,如果调用了任何方法,线程的执行顺序都是无序的。

pcrecxhr

pcrecxhr1#

通过右击断点点,可以选择一些选项,例如“在线程上挂起”。

qgzx9mmu

qgzx9mmu2#

事实上,IDEA 15(http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/)已经解决了这个问题。
此外,当在另一个线程中到达断点时,会有一个通知-我发现这相当不错。

1l5u6lss

1l5u6lss3#

从Intellij IDEA 16开始,通过只恢复当前线程来解决这个问题,并且可以通过在IDEA vmoptions中启用“debugger.step. resume.one.thread”属性来测试in the latest IDEA 16 EAP

hmae6n7t

hmae6n7t4#

您可以右键单击调试点,然后指定一个条件,使其仅在到达给定线程id时停止。在运行调试模式时,可以使用Thread.currentThread().getId()获取id。

相关问题