在我参与的一个开源应用程序中,我们有一个错误,应用程序并不总是正确关闭。这就是我想要解决的问题。
经验表明,当线程和进程正在启动但管理不当时(例如,线程正在等待套接字连接,应用程序正在关闭并且线程继续等待),大多数情况下都会发生这种情况。
考虑到这一点,我在整个源代码中搜索了“.start()”,发现了 53 次(这让我有点害怕)。
作为第一步,我想创建一个帮助程序类 (ThreadExecutor),其中当前代码“thread.start()”将被“ThreadExecutor.Execute(thread)”替换,以便 a) 对现有源代码进行少量更改b) 一个类,我可以在其中轻松检查哪些线程没有按预期结束。为此,我想
- 在调用Execute方法时将要执行的线程添加到一个名为activeThreads的列表中
- 开始话题
- 结束时将其从 activeThreads 列表中删除。
这样我就有了所有正在执行的线程的最新列表,当应用程序在关闭时挂起时我可以在其中看到是哪个线程导致了它。
问题:
- 您如何看待这个概念?我通常使用 C# 进行编码,并且知道如何使用 .NET 和 worker 来完成它,但我不太确定什么是 Java 中最好的(我想在现有源代码中修改尽可能少的代码行)。
- 如果这个概念看起来没问题,我怎样才能得到线程终止的通知。我想避免让一个额外的线程每隔一段时间检查 activeThreads 中包含的所有线程的状态,如果它们终止就将它们删除。
澄清一下:在弄清楚如何正确终止应用程序之前,我想问的是找出哪些线程导致某些很难重现的测试用例的最佳/最简单方法是什么。
最佳答案
在更改任何代码之前,我会尝试分析您的应用程序的行为。代码更改可能会引入新问题 - 如果您正在尝试解决问题,这不是您想要做的事情。
检查当前正在运行的线程的应用程序状态的最简单方法是获取线程转储。你说你的问题是应用程序在关机时挂起。这是应用线程转储的完美场景。您将能够看到哪些线程被阻止。
您可以阅读有关线程转储的更多信息 here .
关于java - 分析多线程 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169370/