在Java中是否存在与静态初始化器相反的工具

时间:2013-11-16 16:10:42

标签: java

即使在public static void main开始之前加载类时也会执行静态块。是否有可能在程序关闭之前运行某些代码?

2 个答案:

答案 0 :(得分:5)

我认为你正在寻找Runtime.addShutdownHook。它不是静态初始化程序块的语言级构造,但我认为它会做你想要的。

你应该注意关机钩子 - 请参阅文档,了解它们周围的各种警告。

答案 1 :(得分:1)

来自Runtime.addShutdownHook: -

只是为Jon Skeets的答案添加一点

  

关闭挂钩只是一个初始化但未启动的线程。什么时候   虚拟机开始关闭序列,它将启动所有   注册的shutdown挂钩以某种未指定的顺序挂起并让它们运行   同时。当所有钩子都完成后,它将全部运行   如果启用了finalization-on-exit,则不会被激活的终结器。   最后,虚拟机将停止。请注意,守护程序线程将   在关闭序列期间继续运行,非守护进程也是如此   通过调用exit方法启动关闭的线程。

     

在极少数情况下,虚拟机可能会中止,即停止   在没有干净地关闭的情况下跑步。这发生在虚拟时   机器在外部终止,例如使用SIGKILL信号   在Unix上或Microsoft Windows上的TerminateProcess调用。虚拟   例如,如果本机方法出错,机器也可能会中止   破坏内部数据结构或尝试访问   不存在的记忆。如果虚拟机中止则无法保证   可以判断是否会运行任何关闭挂钩。