如何在关机钩子中获取返回代码



我需要根据我的应用程序结果修改 JVM 返回代码。

但是显式调用System.exit(code(是有风险的,因为应用程序很复杂,很难确定正在运行的线程的结束。

所以我想出使用关闭钩子在 JVM 退出之前修改返回代码。

但是有一个问题,我如何获取 JVM 的原始返回代码,因为它可能是一个错误代码不是 0。

你不应该在关闭钩子中调用 exit 方法,System.exit(status)内部调用 Runtime.getRuntime().exit(status);这将导致你的应用程序无限期阻塞。

根据JavaDoc

如果在虚拟机启动其 关闭顺序,然后如果关闭钩子正在运行此方法 将无限期阻止。

您无权访问status,因为即使在调用所有关闭钩子后,它也可能更改。

由于关闭钩子和退出状态不兼容,您可以创建一个 Throwable,其唯一功能是在 main 方法中捕获。然后,捕获块成为您的关闭块。在那里你可以调用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
            }
    }
}

最新更新