返回介绍

8.2 正式起航

发布于 2024-08-21 22:20:21 字数 1561 浏览 0 评论 0 收藏 0

在正式开始之前,先让我们熟悉一下Eclipse的调试环境。当你使用Eclipse调试Java程序时,当程序执行到断点处,默认情况下,当前的线程就会被挂起。

图8.1显示了在ArrayList.add()函数内部设置了一个断点:

图8-1 将断点设置在ArrayList.add()内

接着,以调试方式启动上面的代码,可以看到,程序会停留在系统第一次调用ArrayList.add()的地方,如图8.2所示。

图8.2 断点阻止了程序的运行

在上图8.2中,可以看到主线程main停留在ArrayList.add()中,并且显示了完整的调用堆栈。但很不幸的是,其实我们对主函数并没有太大兴趣,因为这些都是JDK内部的代码实现。目前,我们更关心的是在程序中t1和t2线程对ArrayList的调用。因此,我们会更希望忽略这些无关的调用。对于ArrayList这种非常常用的类来说,如果不加识别地进行断点设置,对系统的整个调试会变得异常痛苦。那么应该怎么处理呢?

依托于Eclipse的强大功能,我们很容易实现这点。我们可以为这个断点设置一些额外属性,如图8.3所示。

图8.3 设置断点属性

由于我们不希望主函数启动时被中断,因此在条件断点中指定断点条件是当前线程而不是主线程main,如图8.4所示,取得当前线程名称,并判断是否为主线程:

图8.4 设置条件断点

基于以上设置,再次执行调试这段代码,我们就可以调试t1和t2线程了,如图8.5所示。

图8.5 被中断的t1和t2

从这个调试窗口中可以看到,当前正在执行的几个线程,这里显示了t1、t2和t3。由于t3线程并没有使用ArrayList,因此,它处于Running状态,并保持一直执行。而t1和t2两个线程都在ArrayList.add()方法中被挂起。

如上图8.5所示,当前选中的是t2线程,如果我们进行单步操作,那么t2线程就会执行,而t1不会继续执行,除非,你手工选择t1并进行相应的操作。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文