Idea Intellij多线程调试

(适用Idea 14 & 15,其余版本未知)java

几天前遇到一个问题: 
在多线程调试的时候,一些断点会被跳过。多线程

好比像下面的代码:ide

public static void main(String[] args) throws InterruptedException {
    new Thread() { // 断点0
        @Override
        public void run() {
            System.out.println("1"); // 断点1
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("2"); // 断点2
        }
    }.start();
    // 外线程
    System.out.println("3"); // 断点3
    Thread.sleep(2000);
    System.out.println("4"); // 断点4
}

启动调试后,可能会命中断点1或者断点3,命中路径能够是3->2->4或者3->4甚至3->2,总之并不会命中所有断点。在单步调试的过程当中,代码的执行速度事实上远比直接运行慢得多,因此我加入了一些sleep用来模拟这些延迟的过程。线程

这段代码一共有两个线程,在调试一个线程的过程当中,很显然另外一个线程是在运行的。因此咱们能够猜想是否是Idea是否是会在咱们调试一个线程时,屏蔽另外一个线程的断点。 
为了验证这个观点,只须要在命中断点0处以后单步,就会到断点3,然会你调试得“慢”一点,就会发现断点1和2被跳过了。调试

这里写图片描述 
打钩的是我当前调试的线程(main线程),当你开始单步调试以后,这个堆栈会刷新。code

这显然是不能接受的,对于多线程调试来讲,最重要的就是控制两个线程的执行顺序,咱们要作的其实就是当另外一个不处于调试状态的线程命中断点后,能先暂停,一直等到我去处理为止。图片

通过一番折腾后发现,其实Idea提供了这个功能,在断点处右键 
这里写图片描述 
它提供了两种挂起的模式,默认的是All,只须要选中Thread,它就会一直等待到你处理它。 
右边的Make Default功能会使得以后打上的断点也会是Thread模式的(注意,以前打上的不会变动,须要手工更改)。 
这里写图片描述 
两个红圈的按钮就能够改,在Debug窗口的最右边。io

以后就能够开心地调试了,对了,在这里切换线程 
这里写图片描述class

相关文章
相关标签/搜索