8.2 正式起航
在正式开始之前,先让我们熟悉一下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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论