在intellij中进行单步调试时如何保持在当前线程上

Nat*_*han 6 java debugging multithreading intellij-idea intellij-14

在 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";
            }
Run Code Online (Sandbox Code Playgroud)

我有 6 个线程,都在运行上面的代码。

Intellij 不断更改我所在的当前线程,这意味着当我为 T1 发出“Step over”(F8)命令时,调试器会将焦点更改为 T2。我很期待是留在T1 ,而我调试-这样产生的结果:

T1: 1x
T1: 2x
T1: 3x
T1: 1x
T1: 2x
Run Code Online (Sandbox Code Playgroud)

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

T2: 1x
T2: 2x
T2: 3x
T2: 1x
T2: 2x
T2: 3x
Run Code Online (Sandbox Code Playgroud)

然后,回到T1:

T1: 3x  (it picks back up from where it left off)
Run Code Online (Sandbox Code Playgroud)

相反,我得到的是:

T1: 1x
T3: 1x
T5: 1x
T1: 2x
T2: 1x
T3: 2x
T1: 3x
etc.
Run Code Online (Sandbox Code Playgroud)

这是乱序的,而且一点也不直观。

如果我想要我的预期行为,我必须执行以下操作:

切换到 T1:

T1: 1x
Run Code Online (Sandbox Code Playgroud)

切换到 T1:

T1: 2x
Run Code Online (Sandbox Code Playgroud)

切换到 T1:

T1: 3x
Run Code Online (Sandbox Code Playgroud)

切换到T2:

T2: 1x
Run Code Online (Sandbox Code Playgroud)

切换到T2:

T2: 2x
Run Code Online (Sandbox Code Playgroud)

切换到T2:

T2: 3x
Run Code Online (Sandbox Code Playgroud)

切换到 T1:

T1: 1x
Run Code Online (Sandbox Code Playgroud)

等等...

我已经寻找了一种方法来防止这种情况发生,但我还没有找到解决方案,而我发现的唯一方法(保持步进我当前的线程)是每次我都用鼠标选择它步。

问题是:我如何防止 intellij 更改我所在的线程?

编辑:我应该指出,如果调用任何方法,线程执行顺序是乱序的。

au.*_*.tw 5

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

在此输入图像描述


Nat*_*han 2

事实上,IDEA 15 ( http://blog.jetbrains.com/idea/2015/06/intellij-idea-15-eap-is-open/ ) 已经解决了这个问题。

此外,当另一个线程中到达断点时,会有一个通知 - 我发现这相当不错。