我打电话 System.exit(1) 在我的多线程程序中。但是,该程序不时而不是返回代码1,以返回代码0退出。我没有任何其他电话 System.exit() 我很肯定该计划不会干净利落。可能是什么原因,我该如何避免?

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

有帮助吗?

解决方案

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

不应该期望打电话 System.exit() 在具有多个线程的应用程序中,该程序将使程序干净地退出。

而不是打电话 System.exit() 要离开程序,您应该向每个移动组件发送关闭消息并使用 Thread.join() 恢复您创建的任何线程。您的应用程序应该能够以这种方式很好地关闭所有作品。主线程中的最终命令应该是返回您的退出代码。如果你只是打电话 System.exit(), ,您将所有这些关闭的细节留给了JVM,这只是采取了重型的方法并当场杀死了一切。

你用过了吗? Runtime.getRuntime.addShutdownHook() 根本吗?打电话 System.exit() 将调用任何可能已安装的关闭挂钩,这可能会更改退出代码。

其他提示

运行时的文档。停止(int)关于其论点的说明:

如果出口(等效, System.exit)方法已经被调用,那么此状态代码将覆盖传递给该方法的状态代码。

所以也许有些东西正在唤起 Runtime.halt(int). 。在关闭挂钩或最终确定器中?

我认为,如果您的JVM终止,这可能会发生这种情况 System.exit(1) 实际执行。您认为您的系统中可能有可能吗?

要么,带有的代码 System.exit(1) 在守护程序线程中执行,因此,当所有其他实时(非daemon)线程完成工作JVM时,JVM干净(或不干净),因为如果您编程会引发异常!)

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

注意:请忽略我以前的评论。打电话 System.exit(1) 将终止所有当前运行的守护程序/非daemon线程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top