我在多线程程序中调用了System.exit(1)
。然而,有时不是返回代码1,程序退出时返回代码为0.我没有任何其他调用System.exit()
而且我肯定程序没有干净地退出。可能是什么原因,我该如何避免呢?
请注意,错误是间歇性的,我无法在单线程程序中重现相同的行为。
答案 0 :(得分:4)
修改您的设计以执行更受控制的关闭。
不应期望在具有多个线程的应用程序中调用System.exit()
会导致程序干净地退出。
您应该向每个移动组件发送关闭消息,并使用System.exit()
恢复您创建的任何线程,而不是调用Thread.join()
离开程序。您的应用程序应该能够以这种方式很好地关闭所有部分。主线程中的最后一个命令应该是返回退出代码。如果您只是致电System.exit()
,那么您将把所有这些关闭的细节留给JVM,这只是采取严厉的方法并当场杀死所有内容。
你有没有使用Runtime.getRuntime.addShutdownHook()
?对System.exit()
的调用将调用可能安装的任何关闭挂钩,这可能会更改退出代码。
答案 1 :(得分:1)
Runtime的文档。halt(int)说明了以下关于它的论点:
如果已经调用了exit(等效,
System.exit
)方法,则此状态代码将覆盖传递给该方法的状态代码。
所以也许正在调用Runtime.halt(int)
。在关机钩子或终结器?
答案 2 :(得分:0)
我认为如果您的JVM在 System.exit(1)
实际执行之前终止,则可能会发生这种情况。你认为这可能在你的系统中有可能吗?
要么,System.exit(1)
的代码正在守护程序线程中执行,所以当所有其他实时(非守护程序)线程完成工作时,JVM干净地退出(或者不干净,因为你仍然可以获得0退出代码,如果你的程序抛出异常!)
或者,正如@Erick Robertson所建议的那样,也许有些东西正在从钩子或其他东西修改退出状态,虽然我不确定这是怎么回事。
注意:请忽略我以前的评论。调用System.exit(1)
将终止所有当前运行的守护程序/非守护程序线程。