Hook作为一种回调方式,广泛应用于软件中。
从Java 1.3开始,JVM的Runtime也提供了hook的机制,即shutdown hook。提供给出shutdown hook,在退出JVM的时候,能够执行shutdown hook中定义的必要操作。
1. Runtime的Shutdown Hook的特性
- 可以注册多个hook,每个都是一个独立的线程
- 如果有多个Hook,Hook线程之间是没有同步的,线程运行的时序是不可预测的
- 一旦开始执行Shutdown Hook,即无法再注册或删除其他hook
- 正在执行的Shutdown Hooks,还可能被外部的SIGTERM信号强制停止
- 正在执行的Shutdown Hooks,在JVM内部只能通过调用Runtime.halt()停止hook的执行
- 如果JVM启用了Java Security Managers,则执行Shutdown Hook需要shutdownHooks权限
2. 注册Shutdown Hook的方式
Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable() {
@Override
public void run() {
abc;...
}
});
);
在Java 8以后,还可以采用如下流式方式注册hook:
Runtime.getRuntime().addShutdownHook(