即使在public static void main
开始之前加载类时也会执行静态块。是否有可能在程序关闭之前运行某些代码?
答案 0 :(得分:5)
我认为你正在寻找Runtime.addShutdownHook
。它不是静态初始化程序块的语言级构造,但我认为它会做你想要的。
你应该注意关机钩子 - 请参阅文档,了解它们周围的各种警告。
答案 1 :(得分:1)
只是为Jon Skeets的答案添加一点
关闭挂钩只是一个初始化但未启动的线程。什么时候 虚拟机开始关闭序列,它将启动所有 注册的shutdown挂钩以某种未指定的顺序挂起并让它们运行 同时。当所有钩子都完成后,它将全部运行 如果启用了finalization-on-exit,则不会被激活的终结器。 最后,虚拟机将停止。请注意,守护程序线程将 在关闭序列期间继续运行,非守护进程也是如此 通过调用exit方法启动关闭的线程。
在极少数情况下,虚拟机可能会中止,即停止 在没有干净地关闭的情况下跑步。这发生在虚拟时 机器在外部终止,例如使用SIGKILL信号 在Unix上或Microsoft Windows上的TerminateProcess调用。虚拟 例如,如果本机方法出错,机器也可能会中止 破坏内部数据结构或尝试访问 不存在的记忆。如果虚拟机中止则无法保证 可以判断是否会运行任何关闭挂钩。