Idea Intellij多线程调试

 

 weixin_34205826 最后发布于2017-11-08 10:57:00 阅读数 10  收藏

展开

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

比如像下面的代码:

 
  1. public static void main(String[] args) throws InterruptedException {

  2. new Thread() { // 断点0

  3. @Override

  4. public void run() {

  5. System.out.println("1"); // 断点1

  6. try {

  7. Thread.sleep(2000);

  8. } catch (InterruptedException e) {

  9. e.printStackTrace();

  10. }

  11. System.out.println("2"); // 断点2

  12. }

  13. }.start();

  14. // 外线程

  15. System.out.println("3"); // 断点3

  16. Thread.sleep(2000);

  17. System.out.println("4"); // 断点4

  18. }

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

这段代码一共有两个线程,在调试一个线程的过程中,很显然另一个线程是在运行的。所以我们可以猜测是不是Idea是不是会在我们调试一个线程时,屏蔽另一个线程的断点。 
为了验证这个观点,只需要在命中断点0处之后单步,就会到断点3,然会你调试得“慢”一点,就会发现断点1和2被跳过了。

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

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

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

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

转载于:https://my.oschina.net/u/2935389/blog/1568117

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值