如何捕获 System.exit 事件?

Posted

技术标签:

【中文标题】如何捕获 System.exit 事件?【英文标题】:How to capture System.exit event? 【发布时间】:2010-10-29 05:13:24 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

但是,这是一个应该小心处理的领域,因为它是在 JVM 生命周期的一个非常敏感的时间执行的。来自Runtime.addShutdownHook 方法的 API 规范:

关闭挂钩运行在一个微妙的时间 在虚拟机的生命周期中 因此应该编码 防守。他们应该,在 特别是,写成 线程安全并避免死锁 尽可能。

无论如何,请务必阅读有关关闭挂钩如何工作的一些信息,因为如果没有做好准备,可能不应该接近它们。请务必仔细阅读 Runtime.addShutdownHook 方法的 API 规范。

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

Shutdown Hooks -- 它显示了如何添加关闭挂钩以在关闭时进行日志记录的小示例。

Design of the Shutdown Hooks API -- 以问答方式解决一些关闭挂钩的设计决策。

【讨论】:

【参考方案2】:

Runtime.addShutdownHook(Thread thehook) 函数允许您在 Java 虚拟机中注册一个钩子。 该钩子作为一个已初始化但未启动的线程工作,该线程将在退出时由 JVM 调用。如果您注册了多个钩子,请注意调用钩子的顺序是不确定的。

【讨论】:

以上是关于如何捕获 System.exit 事件?的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 RuntimeException 和 finally 子句:哪个先出现?

异常+异常链

如何从视图中捕获关键事件?

如何防止哨兵捕获某些未捕获的异常和记录消息的事件?

如何捕获浏览器关闭事件?

如何捕获浏览器窗口关闭事件?