2018-08-02 IntelliJ IDEA - Debug 调试多线程程序IntelliJ IDEA - Debug 调试多线程程序

https://blog.csdn.net/nextyu/article/details/79039566

IntelliJ IDEA - Debug 调试多线程程序

新建 MyRunnable

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        Thread currentThread = Thread.currentThread();
        System.out.println(currentThread.getName() + "-------------进入");

        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(currentThread.getName() + "-------------离开");
        }

    }
}

创建三个线程

public class MyTest {

    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread1 = new Thread(myRunnable, "线程1");
        Thread thread2 = new Thread(myRunnable, "线程2");
        Thread thread3 = new Thread(myRunnable, "线程3");

        thread1.start();
        thread2.start();
        thread3.start();
    }

}

打断点

Debug 运行 MyTest.main()

下文默认线程的执行顺序为:线程1->线程2->线程3。(实际情况不一定如此)

你会发现 idea 会停在断点处,上面显示当前线程为“线程1”(注意,这里可能为“线程2”或者“线程3”,因为不确定哪个线程先抢到资源)。

然后继续运行程序 F9,跳到下一个断点

你会发现控制台三个线程的日志都打印出来了

线程1-------------进入
线程2-------------进入
线程3-------------进入

也就是说,idea 只停留在了“线程1”的断点上,“线程2”和“线程3”的断点直接忽略了。

这不是我们想要的,我们希望每个线程的断点都会停留。可以做如下设置。

设置

断点上直接右键设置

把 All 改为 Thread。如果点了 Make Default ,那么后续加上的断点都是 Thead 设置,之前加上的断点不影响。

把上面的两个断点都改为 Thread 设置,再 Debug 运行 MyTest.main()。

你会发现 idea 首先留在了“线程1”的断点上,F9,继续运行,接着会停留在 “线程2”的断点上,F9,继续运行,又会停留在 “线程3”的断点上。

或者打开断点视图设置

和上面的效果是一样的。

结语

由于本人知识和能力有限,文中如有没说清楚的地方,希望大家能在评论区指出,以帮助我将博文写得更好。

</article>

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nextyu/article/details/79039566

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

挖洞经验 | 命令注入突破长度限制

0x01 背景 很多时候,在我们历经千辛万苦挖掘出一个漏洞或者找到一个利用点的时候,却因为一些egg hurt的限制,导致get shell或者send pay...

24110
来自专栏前端侠2.0

Angular技巧汇总 原

    声明项目的全局类型,同时不需要在各个Ts文件中import {XXX} from 'xxx'  ,就能直接引用!方法是:

1172
来自专栏杨建荣的学习笔记

一个细小的空间问题触发的报警(r11笔记第68天)

今天有一个数据库服务器报警,报警信息是来自于一个异机备库。可以看到这台服务器空间只有300多G,而剩余空间只剩下了不到30G.所以这样一个问题就很奇怪了...

3667
来自专栏竹清助手

NodeJS错误处理最佳实践

NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管。但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学。如果...

2263
来自专栏C++

python笔记:#002#第一个python程序

1194
来自专栏向治洪

android 防止反编译的若干方法

第一种方式:混淆策略 混淆策略是每个应用必须增加的一种防护策略,同时他不仅是为了防护,也是为了减小应用安装包的大小,所以他是每个应用发版之前必须要添加的一项...

3498
来自专栏蓝天

redis的一些简介

Redis是Remote Dictionary Server的缩写,他本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库。

1061
来自专栏熊二哥

快速入门系列--CLR--02多线程

最近,由于基础框架的整体升级,因此需要更新所有相关项目的DLL文件。这个过程存在不小的风险,因此也对发布后的生产服务器进行了密切的监控,结果还是出现了个别应用出...

1849
来自专栏于晓飞的专栏

理解 CRLF,LF

CRLF, LF 是用来表示文本换行的方式。CR(Carriage Return) 代表回车,对应字符 '\r';LF(Line Feed) 代表换行,对应字符...

2153
来自专栏PHP实战技术

PHP ob_start() 函数介绍

php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数。

4019

扫码关注云+社区

领取腾讯云代金券