阅读ElasticSearch的源码时,BootStrap类中调用了Runtime.getRuntime().addShutdownHook方法。
这篇文章对java.lang包中的Runtime类的addShutdownHook方法进行说明。
这个方法的意思就是在JVM中增加一个关闭的钩子,当JVM关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,JVM才会关闭。所以这些钩子可以在JVM关闭的时候进行内存清理、对象销毁等操作。
为了更清晰的说明,编写如下程序:
public class TestShutdownHook {
public static void main(String[] args) {
// thread1
Thread thread1 = new Thread() {
public void run() {
System.out.println("thread1");
}
};
// thread2
Thread thread2 = new Thread() {
public void run() {
System.out.println("thread2");
}
};
// shutdownThread
Thread shutdownThread = new Thread() {
public void run() {
System.out.println("shutdownThread");
}
};
Runtime.getRuntime().addShutdownHook(shutdownThread);
thread1.start();
thread2.start();
}
}
输出结果:
thread1
thread2
shutdownThread
或
thread2
thread2
shutdownThread
无论是先打印thread1还是thread2,shutdownThread 线程都是最后执行的(因为这个线程是在JVM执行关闭前才会执行)。