Java 提供名为 ShutdownHook 的钩子,能够允许你在程序正常退出前执行特定代码。一般用于清理资源、输出日志、保护当前正在执行的任务的执行。
ShutdownHook 是一个不立刻执行的 Thread,当程序正常退出时它被执行,可以同时存在多个 ShutdownHook。
注意,使用 kill -9 [pid]
是立刻杀死进程,不会执行 ShutdownHook;而以下条件下会执行:
- 正常退出
System.exit()
Ctrl+C
OutOfMemoryError
kill [pid]
使用方法如下:
try {
Runtime.getRuntime().addShutdownHook(hook);
} catch (IllegalArgumentException e) {
// 已注册过
} catch (IllegalStateException e) {
// VM 正在关闭
} catch (SecurityException e) {
// 操作被 SecurityManager 拒绝
}
try {
Runtime.getRuntime().removeShutdownHook(hook);
} catch (IllegalStateException e) {
// VM 正在关闭
} catch (SecurityException e) {
// 操作被 SecurityManager 拒绝
}