在多线程程序中,System.exit(1)以返回代码0退出

4

我在我的多线程程序中调用了System.exit(1),但是有时程序退出代码不是1,而是0。我没有其他调用System.exit()的地方,并且我确定程序并没有正常退出。可能的原因是什么,如何避免这种情况发生?

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


你能否提供更多关于你的猜测的细节,说明应用程序没有正常退出的行为可能有助于人们更好地理解正在发生的事情。 - Grant Thomas
程序中是否还有其他的System.exit()语句? - Volker Stolz
@ShiDoiSi:我的代码中没有其他System.exit()(如问题所述)。 - Alexandru
@Mr. Disappointment:这不是猜测。我正在调试我的应用程序,故意提供错误的输入来触发System.exit(1)。我进行了广泛的日志记录以验证执行路径。 - Alexandru
@Alexandru:好的,请求仍然有效,然而,了解你“确信”的行为可能仍然是有益的。 - Grant Thomas
显示剩余2条评论
3个回答

4

修改您的设计以执行更加可控的关闭。

在具有多个线程的应用程序中调用System.exit()不应该期望程序能够干净地退出。

与其调用System.exit()离开程序,您应该向每个运动组件发送关闭消息,并使用Thread.join()恢复您创建的任何线程。通过这种方式,您的应用程序应该能够很好地关闭所有部分。主线程中的最后一个命令应该是返回您的退出代码。如果您只调用System.exit(),则将所有这些关闭详细信息留给JVM处理,它只会采取强硬的方法并立即杀死所有内容。

您是否使用过Runtime.getRuntime.addShutdownHook()?调用System.exit()将调用可能已安装的任何关闭钩子,这可能会更改退出代码。


我会听从你的建议。我使用 System.exit(1) 作为一种快捷方式来帮助我调试。 - Alexandru

1

关于Runtime.halt(int)的文档如下所述:

如果已经调用了退出(等效于System.exit)方法,则此状态代码将覆盖传递给该方法的状态代码。

因此,可能有些东西正在调用Runtime.halt(int)。在关闭挂钩或终结器中?


0

我认为唯一可能发生这种情况的方式是在System.exit(1)实际执行之前,您的JVM终止。您认为这在您的系统中可能吗?

或者,带有System.exit(1)的代码正在守护线程中执行,因此当所有其他活动(非守护)线程完成工作时,JVM会干净地退出(或不干净,因为如果您的程序抛出异常,仍然可以获得0退出代码!)

另外,正如@Erick Robertson所建议的那样,也许有些东西正在从钩子或其他地方修改退出状态,尽管我不确定这是如何可能的。

注意:请忽略我的先前评论。调用System.exit(1)将立即终止所有当前运行的守护程序/非守护程序线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接