Java程序经常会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。
JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用:
- 程序正常退出
- 使用System.exit()
- 终端使用Ctrl+C触发的中断
- 系统关闭
- OutOfMemory宕机
- 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的)
Runtime.getRuntime().addShutdownHook(shutdownHook);
这个方法的含义说明:
这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁、关闭连接等操作。
1. package cn.cmcc.test;
2.
3. public class ShutDownTest {
4. /**
5. * @param args
6. */
7. public static void main(String[] args) {
8. // 定义线程1
9. Thread thread1 = new Thread() {
10. public void run() {
11. System.out.println("thread1...");
12. }
13. };
14.
15. // 定义线程2
16. Thread thread2 = new Thread() {
17. public void run() {
18. System.out.println("thread2...");
19. }
20. };
21. // 定义关闭线程
22. Thread shutdownThread = new Thread() {
23. public void run() {
24. System.out.println("shutdownThread...");
25. }
26. };
27. // jvm关闭的时候先执行该线程钩子
28. Runtime.getRuntime().addShutdownHook(shutdownThread);
29. thread1.start();
30. thread2.start();
31. }
32. }
打印结果:
thread2...
thread1...
shutdownThread...
或者:
thread1...
thread2...
shutdownThread...
结论:
无论是先打印thread1还是thread2,shutdownThread 线程都是最后执行的(因为这个线程是在jvm执行关闭前才会执行)。