我有一个java应用程序,其中我尝试确保如果有人退出代码中的System.exit(),则应该调用侦听器来执行一些操作,例如记录消息和释放资源...
我该如何实施它,欢迎任何建议/方法。
Runtime.addShutdownHook
方法可用于添加关闭钩子,它基本上是一个未启动的Thread
,它在Java虚拟机关闭时执行。
但是,这是应该谨慎对待的领域,因为它是在 JVM 生命周期的非常敏感的时间执行的。来自
Runtime.addShutdownHook
方法的 API 规范:
关闭钩子在微妙的时间运行 在虚拟机的生命周期中 因此应该编码 防守地。他们应该,在 特别地,可以写成 线程安全并避免死锁 尽可能。
无论如何,请务必阅读一些有关关闭挂钩如何工作的信息,因为如果没有做好充分的准备,可能不应该接触它们。请务必仔细阅读
Runtime.addShutdownHook
方法的 API 规范。
以下是我在搜索此答案的信息时发现的几篇文章:
Shutdown Hooks——它展示了如何添加关闭钩子以在关闭时进行日志记录的小示例。
Shutdown Hooks API 的设计——以问答方式解决关闭钩子的一些设计决策。
函数
Runtime.addShutdownHook(Thread thehook)
允许您将钩子注册到 Java 虚拟机中。您还可以使用 JFR 录制,
jdk.Shutdown
事件默认启用=true,stackTrace=true。因此,使用 jfr print --verbose --events jdk.Shutdown --stack-depth 20 recording.jfc
将显示调用者堆栈跟踪。
执行此操作的最小记录是(为了可读性而换行):
java -XX:StartFlightRecording:settings=none,filename=recording.jfr, \
+jdk.Shutdown#enabled=true,+jdk.Shutdown#stackTrace=true \
SelfExit.java