如何捕获System.exit事件?


问题内容

我在Java中有一个应用程序,其中我尝试确保如果有人在代码中退出代码System.exit(),则应调用侦听器来执行某些操作,例如记录消息并释放资源…

我如何实施它,欢迎任何建议/方法。


问题答案:

Runtime.addShutdownHook方法可用于添加一个关闭钩子,该钩子基本上是未启动的Thread,该钩子在Java虚拟机关闭时执行。

但是,这是应该谨慎对待的领域,因为它是在JVM生命周期的非常敏感的时间执行的。从API规范中获取该Runtime.addShutdownHook方法:

关机挂钩在虚拟机的生命周期中的某个微妙时间运行,因此应进行防御性编码。尤其应将它们编写为线程安全的,并尽可能避免死锁。

无论如何,请务必仔细阅读一下关机挂钩的工作原理,因为如果没有做好充分的准备,就不应该使用它们。请务必仔细阅读该Runtime.addShutdownHook方法的API规范。

这是我在搜索有关此答案的信息时发现的几篇文章:

  • Shutdown Hooks-它显示了一个如何在关闭时添加关闭钩子以记录日志的小例子。

  • Shutdown Hooks API的设计-以问答形式解决关闭钩子的一些设计决策。