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