基础知识一 ShutdownHook挂钩
在其代码中有一个比较重要的基本知识-挂钩,而关闭挂钩是一个已初始化但尚未启动的线程。虚拟机开始启用其关闭序列时,它会以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。运行完所有的挂钩后,如果已启用退出终结,那么虚拟机接着会运行所有未调用的终结方法。最后,虚拟机会暂停。注意,关闭序列期间会继续运行守护线程,如果通过调用 exit 方法来发起关闭序列,那么也会继续运行非守护线程。
虚拟机会为了响应以下两类事件而关闭:
程序正常退出,这发生在最后的非守护线程退出时,或者在调用 exit(等同于System.exit)方法时。或者,
为响应用户中断而终止 虚拟机,如键入 ^C;或发生系统事件,比如用户注销或系统关闭。
常用的场合:关闭数据库链接,或者进行一些资源的清理,不过在使用该方式时,必须小心,该线程须安全,而且执行时间越短越好。
Runtime.getRuntime().addShutdownHook(Thread thread);
例如一下代码:
public class TestShutdownHook extends Thread {
/**
* 实现程序退出前的清理工作
*/
public void run() {
System.out.println(”This is ShutdownHook”);
}
public static void main(String[] args) {
TestShutdownHook m = new TestShutdownHook();
Runtime.getRuntime().addShutdownHook(m);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.exit(0);
}
}
在tomcat的org.apache.catalina.startup.Catalina中就有:
try {
// Register shutdown hook
if (useShutdownHook) {
if (shutdownHook == null) {
shutdownHook = new CatalinaShutdownHook();
}
Runtime.getRuntime().addShutdownHook(shutdownHook);
}
} catch (Throwable t) {
// This will fail on JDK 1.2. Ignoring, as Tomcat can run
// fine without the shutdown hook.
}
tomcat使用该功能主要是处理在tomcat启动时,如果用户中途取消服务器启动时加载的关闭挂钩。