论坛首页 Java企业应用论坛

java虚拟机关闭钩子

浏览 7933 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-03   最后修改:2010-06-04

  java.lang.Runtim类提供了addShutdownHook(Thread hook)方法,用来添加虚拟机关闭的钩子。

 

用途

1应用程序正常退出,在退出时执行特定的业务逻辑

 

2虚拟机非正常退出,比如用户按下ctrl+c,操作系统关闭等。在退出时执行必要的挽救措施。

 

实例:

public class TestOnExit {
    public TestOnExit(){
        doShutDownWork();
    }
    private void doShutDownWork(){
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run(){
                System.out.println("application will exit ....");
            }
        });
    }
    public static void main(String[] args) {
        TestOnExit exit=new TestOnExit();
        long beginTime=System.currentTimeMillis();
        for(int i=0;i<10;i++){
            try {
                System.out.println("application run the "+i+"ci");
                Thread.sleep(10000);
               
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           
        }
        long endTime=System.currentTimeMillis();
        System.out.println("it speat time ..is "+(endTime-beginTime));
    }

}
可以做个测试,首先正常运行


 

执行ctrl+c


然后再试试kill -9 ,

但是遇到kill -9 命令就不行了,所以这个东西还是不很稳定。可用性不高!

kill -9 命令直接就把窗口关掉了,很暴力

我又试了下kill -15 这个,发现是可以的。截个图上来。




 
 然后看运行的结果



 是执行了钩子函数的

 

  • 大小: 31.3 KB
  • 大小: 8.9 KB
  • 大小: 55 KB
  • 大小: 16.7 KB
   发表时间:2010-06-04  
嗯,很多时候都执行不到,但是那些情况可以不考虑,这个里面不应该执行关键性操作,但是还是有用
0 请登录后投票
   发表时间:2010-06-04  
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?
0 请登录后投票
   发表时间:2010-06-04  
beneo 写道
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?

停电肯定是不可能执行的了,关机这个我还没测试过的!呵呵,感觉这个东西并非到处都适用!

至于正常关机这种情况我今天测试一下看看!
0 请登录后投票
   发表时间:2010-06-04  
chenhua_1984 写道
beneo 写道
难道你希望停电或者死机的时候,还能执行钩子里面的代码么?

停电肯定是不可能执行的了,关机这个我还没测试过的!呵呵,感觉这个东西并非到处都适用!

至于正常关机这种情况我今天测试一下看看!



The Java virtual machine shuts down in response to two kinds of events:


The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or

The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.

这两句话已经说明了情况了,我觉得非常明确了。

其实我上面说的关机,是按住电源键不放,基本上跟停电一样。。。
0 请登录后投票
   发表时间:2010-06-04  
kill -9 肯定是不行的,强制关闭了,不属于楼上说的两种情况
0 请登录后投票
   发表时间:2010-06-04  
kill -9 是不行的
kill还有别的一些参数,kill -非9 应该能用到 哈哈
0 请登录后投票
   发表时间:2010-06-04  
tzm1984 写道
kill -9 是不行的
kill还有别的一些参数,kill -非9 应该能用到 哈哈


试了下kill -15 这个是可以的,你说的对。
0 请登录后投票
   发表时间:2010-06-04  
操作系统来不及通知虚拟机就Over的情况下,这个是没有用处的
1 请登录后投票
   发表时间:2010-06-04  
pujia12345 写道
操作系统来不及通知虚拟机就Over的情况下,这个是没有用处的

对,直接断电就不行
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics