addShutdownHook ---程序出错退出终极处理办法(转)

Java程序经常会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。

JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用:

  1. 程序正常退出
  2. 使用System.exit()
  3. 终端使用Ctrl+C触发的中断
  4. 系统关闭
  5. OutOfMemory宕机
  6. 使用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执行关闭前才会执行)。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值