关闭钩子
很多时候,用户关闭程序后需要做一些清理。有时候,并不按照推荐的方法关闭应用程序,有可能不做清理工作。
使用关闭钩子,确保清理代码总是能够执行,无论用户如何终止应用程序。
java虚拟机,会对两类事件进行响应,然后执行关闭操作。
1.调用System.exit()或程序最后一个非守护进程线程退出,应用程序正常退出。
2.用户强制虚拟机中断运行
虚拟机关闭的时候
虚拟机启动所有注册的关闭钩子。关闭钩子通过runtime类注册线程,所有关闭钩子会并发执行。
虚拟机根据情况调用,所有没有被调用过的终结器(finalizer)
创建一个Thread类的子类
实现你自己的run()方法
实例化关闭钩子类
使用当前Runtime类的addShutdownHook(),注册关闭钩子。不需要调用start方法。
public class ShutdownHookDemo(){
public void start(){
ShutdownHook shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(ShutdownHook);
}
public static void main(String[] args){
ShutdownHookDemo demo = ShutdownHookDemo();
demo.start();
}
class ShutdownHook extends Thread{
public void run(){
}
}
}
Tomcat中的关闭钩子
Catalina类负责启动 和 管理其他组件的server对象。 它里面有一个内部类CatalinaShutdownHook的内部类,继承自Thread。它会调Server对象的stop()
Catalina实例启动时,会实例化关闭钩子,在一阶段添加到Runtime类中。
protected class CatalinaShutdownHook extends Thread{
public void run(){
if(server !=null){
((Lifecycle) server).stop();
}
}
}
解决:你不能设定用户总是正常退出。关闭钩子,可以使你,无论发生什么,清理代码总是可以被执行。