System.exit(1)在多线程程序中存在返回码0

时间:2011-01-07 12:57:58

标签: java multithreading exit java-6

我在多线程程序中调用了System.exit(1)。然而,有时不是返回代码1,程序退出时返回代码为0.我没有任何其他调用System.exit()而且我肯定程序没有干净地退出。可能是什么原因,我该如何避免呢?

请注意,错误是间歇性的,我无法在单线程程序中重现相同的行为。

3 个答案:

答案 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)将终止所有当前运行的守护程序/非守护程序线程。