【发布时间】:2014-07-05 04:21:14
【问题描述】:
在发生致命异常的情况下,可以假设程序不再处于安全运行状态,应尽快终止。但是,我想通知用户发生了什么致命错误,而不需要他们搜索日志文件。是终止所有其他正在执行的Threads 的最佳解决方案吗,只保留当前线程以调用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() 立即停止线程。无论如何,这种方法并没有终止所有其他线程,而是简单地给了我InterruptedExceptions 的弹幕。
那么,如何安全地终止处于“不安全状态”的程序,同时仍然允许错误对话框通知用户?
编辑:
让我解释几件事以使我的问题更清楚。当我说“致命异常”时,我的意思是我的程序已捕获但不知道如何处理的已检查的Exception(不是Error)。当这些错误之一发生时,可以假定程序不再处于功能状态(或“不安全”),应尽快终止。但是,等待用户单击错误对话框上的“确定”按钮可能会花费无限时间。因此,我希望在“发生致命异常”时立即终止程序,而不必等待用户确认错误对话框并关闭它。
【问题讨论】:
-
“不安全状态”和“安全终止”在同一个短语中并没有真正的意义......我认为它是可能的(Windows 用旧的 BSoD 做到了),但我不确定是否可以在 JVM 中这样做,因为您编写的代码通常不会在正确的级别上运行以处理 JVM 错误。
-
不清楚你在问什么。如果您正在寻找代码审查,请尝试codereview.stackexchange.com。如果您想知道 JVM 是如何工作的,那就是这里。如果您想讨论 JVM 应该 的行为方式,那么我建议您这样做:chat.stackoverflow.com
-
@user3580294 我已经用更清晰的解释更新了这个问题。
标签: java multithreading exception-handling