在发生致命异常的情况下,可以假定程序不再处于安全状态并且应该尽快终止。但是,我想告诉用户发生了什么致命错误,而不要求他们搜索日志文件。是终止所有其他正在执行的Thread
的最佳解决方案,只留下当前线程来调用JDialog
吗?
这是我尝试解决的问题:
public void killAlienThreads() {
Thread[] threads;
while ((threads = Thread.getAllStackTraces().keySet().toArray(new Thread[0])).length != 1) {
for (Thread thread : threads) {
if (thread != Thread.currentThread())
thread.stop();
}
}
}
调用此方法后,当前线程继续向用户发出警告,然后在处理剩余对话框后关闭程序。
此代码存在许多问题。首先,可以在尝试关闭所有线程时创建新线程,这需要一个只在它只知道当前线程被遗留时才会中断的循环。此外,正如Eclipse警告我的那样,Thread.stop()
已被弃用,但Thread.interrupt()
不能保证立即停止某个线程。无论如何,这种方法不是终止所有其他线程,而是简单地给了我一些InterruptedException
s。
那么,一个程序如何处于“不安全状态”"安全终止,同时仍然允许错误对话框通知用户?
修改
让我解释一些事情,使我的问题更清楚。当我说"致命异常"我的意思是我的程序已经捕获并且不知道如何处理的已检查Exception
(不是Error
)。当其中一个错误发生时,可以假定程序不再处于功能状态(或者它不安全")并且应该尽快终止。但是,等待用户点击" OK"错误对话框上的按钮可能会花费无限的时间。因此,我希望在发生致命异常时立即终止程序"无需等待用户确认错误对话框并将其关闭。
答案 0 :(得分:0)
虽然抛出适当的异常通常会使很多对象处于有效状态,但调用Thead.stop()
之类的不安全方法会完全破坏重要状态并导致更严重的副作用。
最安全的方法是让主进程尽快死掉并使用另一个守护程序进程来报告错误。
如果必须在JVM中执行此操作,则可能必须查看调试或检测API,因为无法中断不调用可中断方法的线程。