在 NetBeans IDE 中调试多线程应用程序
本文档将介绍如何使用 NetBeans IDE 6.5 中的“调试”窗口调试多线程应用程序。本教程还将演示如何使用 IDE 检测应用程序中的死锁。
“调试”窗口将与调试会话、应用程序线程和线程调用堆栈相关的消息都集成到了一个窗口中,这种方式简化了调试过程。通过“调试”窗口,您可以很方便地看到各个应用程序线程的状态,并可暂停和恢复会话中的任意线程。
本教程将使用两个样例项目来演示如何使用“调试”窗口。要完成本教程,您必须先下载 Gallery 和 Deadlock 项目。
本文档针对的是 NetBeans IDE 6.5 发行版。
目录

要学习本教程,您需要具备以下软件和资源。
打开项目
在本教程中,您将使用两个应用程序来演示 IDE 如何为多线程应用程序的调试提供支持。在本练习中,您将在 IDE 中打开两个项目,然后运行它们。运行这两个项目后,您将对每个项目进行测试。
运行 Gallery 项目
Gallery 应用程序是一个简单的 Java Swing 应用程序,它可以播放动画图像。该应用程序有两个按钮,您可以使用这两个按钮来添加和删除动画图像。在本练习中,您将运行 Gallery 应用程序。
- 将 debugging-samples.zip 归档下载并解压缩到您的本地系统。
- 从主菜单中选择“文件”>“打开”。
- 找到并选择 debugging-samples 目录中的 Gallery 项目。单击“打开”。
单击“打开”之后,IDE 将在“项目”窗口中打开并显示该项目。如果在“项目”窗口中展开该节点,您可以看到该项目是一个简单的 Java Swing 应用程序。
- 右键单击该项目节点并选择“运行”以启动 Gallery 应用程序。
- 在 Gallery 应用程序中,单击“更多”可添加图像,单击“更少”可删除图像。

- 关闭 Gallery 应用程序窗口。
Gallery 项目是一个简单的多线程应用程序,在本教程中,您将对其进行调试。
运行 Deadlock 项目
Deadlock 应用程序包含一个 main 方法,该方法可启动一个运行时长为 500000 毫秒的线程。main 方法将启动两个线程,这两个线程在完成时会向“输出”窗口输出消息。
- 从主菜单中选择“文件”>“打开”。
- 找到并选择 debugging-samples 目录中的 Deadlock 项目。单击“打开”。
单击“打开”之后,IDE 将在“项目”窗口中打开并显示该项目。如果在“项目”窗口中展开该节点,您可以看到该项目是一个简单的 Java 应用程序。
- 右键单击该项目节点并选择“运行”以启动 Deadlock 应用程序。
单击“运行”之后,“输出”窗口将打开并显示以下输出。
run:
Application started
MyThread2 successfully finished.
MyThread1 successfully finished
- 等待应用程序正常结束(五分钟)。
当 Deadlock 应用程序结束时,您将在“输出”窗口中看到以下内容。
Main thread finished
Deadlock 项目是一个简单的 Java 应用程序,它有两个线程。在调试该应用程序时,您将创建一个死锁,使用该死锁来说明 IDE 如何帮助您检测死锁。
调试样例项目
Gallery 项目是一个简单的 Java Swing 应用程序,它可以播放动画图像。在该应用程序中,您可以通过单击按钮来添加和删除图像。单击“更多”按钮将启动一个新线程,该线程将显示一个图像并实现该图像的动画效果。单击“更少”按钮将停止最近的线程,停止动画并删除图像。
暂停线程
在本练习中,您将开始调试 Gallery 应用程序,并添加一些图像以启动一些应用程序线程。启动调试会话之后,IDE 将在左侧窗格中打开“调试”窗口。“调试”窗口显示会话中的线程列表。
- 在“项目”窗口中右键单击 Gallery 项目,然后选择“调试”。
单击“调试”之后,IDE 将启动 Gallery 应用程序并打开缺省的调试窗口。IDE 会自动在主窗口的左侧打开“调试”窗口,并在“输出”窗口中打开调试器控制台。
- 在 Gallery 应用程序中单击“更多”三次以启动显示动画图像的三个线程。
查看“调试”窗口,您可看到为每个动画都启动了一个新线程。

- 通过单击“调试”窗口中线程右侧的“暂停线程”按钮暂停两个线程。
当线程暂停之后,该线程的图标会相应变化以指示新的状态。您可以展开线程节点查看线程的调用堆栈。您可以右键单击“调试”窗口中的条目以打开一个带调试命令的弹出式菜单。
查看 Gallery 应用程序,可看到在您暂停线程后,这些线程的动画停止了。
使用“调试”窗口,您可以快速查看和更改会话中的线程状态。缺省情况下,“调试”窗口在窗口的右侧显示“恢复”和“暂停”按钮。您可以使用“调试”窗口底部的工具栏隐藏这两个按钮,还可以进一步对“调试”窗口的显示进行定制。如果您在运行多个调试会话,则可以使用“调试”窗口顶部的下拉列表选择要在窗口中显示哪个线程。
切换线程
本练习展示了在您对某个应用程序进行单步调试期间如果另一个应用程序线程遇到断点将发生的情况。在本练习中,您将设置一个方法断点,并启动对应用程序的单步调试。在您对应用程序进行单步调试时,您还将启动一个新的线程,该线程也将遇到断点。当新线程遇到断点时,IDE 会在“调试”窗口中显示通知,以告诉您所发生的情况。然后,您可以在线程之间进行切换。
- 在“项目”窗口中展开 gallery 包,并双击 Gallery.java 以在编辑器中打开该文件。
- 通过单击第 174 行的左侧空白,在 run 方法的开头中的 Gallery.java 中插入一个方法断点。
- 在 Gallery 应用程序中单击“更多”以启动一个将遇到该方法断点的新线程。
- 单击“步过”(F8) 数次以启动该方法的单步调试。
单步调试该方法时,您可以看到编辑器页边区域中的程序计数器指示了您的位置。
- 在 Gallery 应用程序中单击“更多”以启动一个将遇到该方法断点的新线程。
当新线程遇到方法断点时,“调试”窗口中会显示一个“遇到新断点”通知,告诉您在您单步调试该方法时另一个线程遇到了断点。
当您单步调试某个线程时如果另一个线程遇到了断点,IDE 会让您选择是切换到另一个线程还是继续单步调试当前的线程。您可以单击“遇到新断点”通知中的箭头按钮切换到遇到断点的线程。您随时都可以通过在通知窗口中选择新线程来切换到新线程。单步调试当前断点线程将继续当前线程,但其他应用程序线程的状态保持不变。
注意:查看“调试”窗口时,您可以看到在页边区域中当前线程 (Thread_Jirka) 由一个绿色条指示。因为遇到断点而调用通知的线程 (Thread_Roman) 由一个黄色条指示,该线程图标表示线程因一个断点而暂停。

- 单击“遇到新断点”通知中的箭头可从当前线程切换到新线程 (Thread_Roman)。
切换到新线程后,您可以看到以下变化:
- 程序计数器的位置移动到了新的当前线程 (Thread_Roman) 的第 175 行。
- 现在,可以在第 191 行的页边区域看到一个“暂停的线程”标注,表示一个线程 (Thread_Jirka) 在该行暂停。

- 数次单击“步过”以单步调试新的当前线程 (Thread_Roman)。
- 右键单击编辑器页边区域中的“暂停的线程”标注并选择“设置为当前线程”>“Thread_Jirka”切换回暂停的线程。
此外,您也可以调用“当前线程选择器”(Alt+Shift+T) 并切换到应用程序的任意线程。

当您切换回 Thread_Jirka 时,“暂停的线程”标注将出现在 Thread_Roman 暂停时所处的行旁边。您可以通过单击“调试”窗口中的“恢复”来恢复 Thread_Roman。
使用“调试”窗口,您可以非常精确地查看和控制线程状态。调试器对应用程序线程进行管理以简化调试工作流并防止调试进程造成死锁。在本练习中,在 IDE 中调试应用程序时,您看到了以下行为。
- 当某个线程遇到一个断点时,只有该断点线程将被暂停。
- 在单步调试应用程序时,如果应用程序的其他线程遇到断点,当前线程不受影响。
- 单步调试仅会继续执行当前线程。单步调试完成时,只有当前线程将被暂停。
现在可以退出 Gallery 应用程序。在下一个练习中,您将测试 Deadlock 应用程序并使用 IDE 来帮助您检测死锁。
检测死锁
IDE 可以自动在所有暂停的线程间搜索死锁,因而可以帮助您识别潜在的死锁情况。检测到死锁后,IDE 会在“调试”窗口中显示一个通知并标识出所涉及的线程。
为了演示 IDE 的死锁检测,您将在调试器中运行一个样例项目 Deadlock 并制造一种死锁情况。
- 展开 myapplication 包并在源代码编辑器中打开 Thread1.java 和 Thread2.java。
- 在 Thread1.java 的第 20 行和 Thread2.java 的第 20 行分别设置一个断点。
要设置断点,请在源代码编辑器中单击您要设置断点的行旁边的页边区域。断点标注将出现在页边区域中该行的左侧。打开“断点”窗口 (Alt-Shift-5),您可以看到已经设置并启用了两个断点。

- 在“项目”窗口中右键单击 Deadlock 项目,然后选择“调试”。
main 方法将运行两个线程,这两个线程都将在其中一个断点处暂停。您可以在“调试”窗口中看到由断点暂停的线程。
- 在“调试”窗口中,可以通过单击暂停的线程右侧的“恢复”按钮来恢复暂停的线程(MyThread1 和 MyThread2)。
恢复线程 MyThread1 和 MyThread2 将造成死锁状况。
- 从主菜单中选择“调试\检查死锁”可检查暂停的线程以查找死锁。
如果您在应用程序中检测到死锁,则“调试”窗口中会出现一条消息告诉您有关死锁的情况。您可以看到,在“调试”窗口的左侧页边区域,死锁由红色条指示。
本教程对 IDE 中的一些调试功能进行了初步介绍。使用“调试”窗口,您在调试应用程序时可以很方便地暂停和恢复线程。在调试多线程应用程序时,这非常有用。
另请参见
有关在 NetBeans IDE 中开发和测试 Java 应用程序的更多信息,请参见以下资源: