【发布时间】:2011-11-17 15:05:36
【问题描述】:
在我参与的一个开源应用程序中,我们遇到了一个错误,即应用程序并不总是正确关闭。这就是我想解决的问题。
经验表明,大多数情况下,当线程和进程正在启动但管理不正确时(例如,线程正在等待套接字连接,应用程序正在关闭并且线程继续等待),就会发生这种情况。
考虑到这一点,我在整个源代码中搜索了“.start()”,发现了 53 次(这让我有点害怕)。
作为第一步,我想创建一个辅助类(ThreadExecutor),其中当前代码“thread.start()”将被“ThreadExecutor.Execute(thread)”替换,以便a)在现有源中仅进行一些更改b) 一个类,我可以在其中轻松检查哪些线程没有按应有的方式结束。为此,我想
- 调用Execute方法时将要执行的线程添加到一个名为activeThreads的列表中
- 启动线程
- 结束时将其从 activeThreads 列表中删除。
这样我就有一个所有正在执行的线程的最新列表,当应用程序在关机时挂起时,我可以在那里看到是哪个线程导致它。
问题:
- 您如何看待这个概念?我通常在编写 c# 并且知道如何使用 .NET 和 worker 来完成它,但我不太确定 Java 中什么是最好的(我想在现有源代码中修改尽可能少的代码行)。
- 如果这个概念看起来不错,我怎样才能得到线程终止的通知。我想避免有一个额外的线程每隔一段时间检查一下 activeThreads 中包含的所有线程的状态,如果它们终止则删除它们。
澄清一下:在弄清楚如何正确终止应用程序之前,我在这里要问的是,对于某些难以重现的测试用例,找出哪些线程是原因的最佳/最简单方法是什么。
【问题讨论】:
-
如果你让线程守护进程——当应用程序被杀死时它们不会被杀死吗?
-
您是否尝试过在应用程序未正常关闭时进行线程转储以查看哪些线程被卡住以及它们在做什么?这可能会给你一些线索。更多信息:java.sun.com/developer/technicalArticles/Programming/Stacktrace
-
不,还没有进行线程转储。我会检查这两个建议。通常我更喜欢自己管理线程的生命周期,而不是不管线程状态如何都杀死所有东西。这让我感觉更有控制力:)
-
找出哪些线程行为不端是解决问题的第一种方法,线程转储将提供所有必要的线索。
标签: java multithreading