我需要根据我的应用程序结果修改JVM的返回代码。
但是明确调用System.exit(code)存在风险,因为该应用程序很复杂,难以确定运行线程的结束时间。
因此,我想到使用关闭挂钩来在JVM退出之前修改返回代码。
但是有一个问题,我如何获取JVM的原始返回代码,因为它可能是一个错误代码而不是0。
我需要根据我的应用程序结果修改JVM的返回代码。
但是明确调用System.exit(code)存在风险,因为该应用程序很复杂,难以确定运行线程的结束时间。
因此,我想到使用关闭挂钩来在JVM退出之前修改返回代码。
但是有一个问题,我如何获取JVM的原始返回代码,因为它可能是一个错误代码而不是0。
System.exit(status)
内部调用 Runtime.getRuntime().exit(status);
这将导致应用程序无限期地阻塞。根据JavaDoc文档描述,如果在虚拟机开始关闭序列后调用此方法,则如果正在运行关闭钩子,此方法将无限期地阻塞。您无法访问status
,因为即使在所有关闭钩子被调用后,状态也可能发生变化。由于关闭挂钩和退出状态不兼容,您可以创建一个 Throwable,其唯一功能是在主方法中被捕获。然后 catch 块就成为了您的关闭块。在那里,您可以调用 System.exit(),甚至保留您的关闭代码(如果需要的话)。
class Emergency extends Throwable{
int exit = 0;
}
public final class Entry {
public static void main(String[] args){
try {
throw new Emergency();
} catch (Emergency e) {
// Shut down the app
}
}
}
Throwable
而不是Exception
,它可能会起作用。 - Brian McCutchon