2009-05-27 107 views
24

我有一个应用程序在Java中,我尝试确保如果有人退出代码System.exit()在代码中,应该调用一个监听器做一些东西,如日志记录消息和释放资源...如何捕获System.exit事件?

我该如何执行它,任何建议/方法是受欢迎的。

回答

50

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

但是,这是一个应该谨慎行事的领域,因为它是在JVM生命周期的一个非常敏感的时刻执行的。从用于Runtime.addShutdownHook方法的API规格:

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

在任何情况下,请务必阅读一下关于挂钩挂钩的工作方式,因为如果没有做好准备,就不应该接近它。请务必仔细阅读Runtime.addShutdownHook方法的API规范。

这里的是一对夫妇的文章中,我从寻找信息,这个答案发现:

5

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