我在我的多线程程序中调用了System.exit(1)
,但是有时程序退出代码不是1,而是0。我没有其他调用System.exit()
的地方,并且我确定程序并没有正常退出。可能的原因是什么,如何避免这种情况发生?
请注意,这个错误是间歇性的,我无法在单线程程序中复现相同的行为。
我在我的多线程程序中调用了System.exit(1)
,但是有时程序退出代码不是1,而是0。我没有其他调用System.exit()
的地方,并且我确定程序并没有正常退出。可能的原因是什么,如何避免这种情况发生?
请注意,这个错误是间歇性的,我无法在单线程程序中复现相同的行为。
修改您的设计以执行更加可控的关闭。
在具有多个线程的应用程序中调用System.exit()
不应该期望程序能够干净地退出。
与其调用System.exit()
离开程序,您应该向每个运动组件发送关闭消息,并使用Thread.join()
恢复您创建的任何线程。通过这种方式,您的应用程序应该能够很好地关闭所有部分。主线程中的最后一个命令应该是返回您的退出代码。如果您只调用System.exit()
,则将所有这些关闭详细信息留给JVM处理,它只会采取强硬的方法并立即杀死所有内容。
您是否使用过Runtime.getRuntime.addShutdownHook()
?调用System.exit()
将调用可能已安装的任何关闭钩子,这可能会更改退出代码。
System.exit(1)
作为一种快捷方式来帮助我调试。 - Alexandru关于Runtime.halt(int)的文档如下所述:
如果已经调用了退出(等效于
System.exit
)方法,则此状态代码将覆盖传递给该方法的状态代码。
因此,可能有些东西正在调用Runtime.halt(int)
。在关闭挂钩或终结器中?
我认为唯一可能发生这种情况的方式是在System.exit(1)
实际执行之前,您的JVM终止。您认为这在您的系统中可能吗?
或者,带有System.exit(1)
的代码正在守护线程中执行,因此当所有其他活动(非守护)线程完成工作时,JVM会干净地退出(或不干净,因为如果您的程序抛出异常,仍然可以获得0退出代码!)
另外,正如@Erick Robertson所建议的那样,也许有些东西正在从钩子或其他地方修改退出状态,尽管我不确定这是如何可能的。
注意:请忽略我的先前评论。调用System.exit(1)
将立即终止所有当前运行的守护程序/非守护程序线程。
System.exit(1)
。我进行了广泛的日志记录以验证执行路径。 - Alexandru