在程序启动的时候,我调用了如下代码:
 Runtime.getRuntime().addShutdownHook(new Thread() {
      public void run() {
        logger.error("Mmsmanager shutdown ... ");
        善后操作........
      }
    }我希望在进程结束的时候,调用善后操作来 关闭所有打开的数据库连接,并且优雅的结束进程中的线程。
分三个问题;
1.我的进程单独启动(linux下),用kill -9 结束进程,jvm根本没有执行我注册的善后操作!
2.把我的这个模块放在一个web里面执行,结束tomcat的时候,也没有看到执行我注册的善后操作!听我的同事说,kill-9是不会给机会执行hookdown的事情的。听说:3:数据库连接在进程被kill的时候,会被关闭,不会继续占用我本机的资源,也不会在继续占用oracle的资源(虽然不是立即就释放了,但是听说oralce能自己处理这些被关闭的连接)。请大家解释以上的几个问题,谢谢大家!!

解决方案 »

  1.   

    在以下二种情况下可以调用:
    The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or 
    程序正常退出或是exit方法被调用时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. 
    用户中断或系统关机或注销事件时或者这篇文章可以帮你的忙.
    http://lists.w3.org/Archives/Public/www-jigsaw/2000JanFeb/0121.html
      

  2.   

    windows下的control +c,语linux下的kill -9 不知后果有什么不同?