关闭钩子(ShutdownHook)

原创 2012年03月22日 20:11:46

http://www.blogjava.net/zJun/archive/2006/03/12/34946.html

关闭钩子”(ShutdownHook)是这样一个概念:向虚拟机注册一个线程,当程序退出(Ctrl+C)时虚拟机会启动这个线程,我们可以在这个线程的run()中做一些清除的工作,如:释放数据库连接,关闭文件等.

注册:

 

Runtime.getRuntime().addShutdownHook(Thread t); 

 

注销:

 

Runtime.getRuntime().removeShutdownHook(Thread t);

 

[例子]

/**
 * 在这个线程中实现程序退出前的清理工作
 * 
 * @author Administrator
 * 
 
*/

class TestThread extends Thread {
    boolean isTerminal 
= false;

    
public void run() {
        
while (!isTerminal) {
               try {
                  Thread.sleep(
1000);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
            System.out.println("run sub thread");
        }
    }

    
/**//**
     * 清理工作
     
*/

    
public void onTerminal() {
        isTerminal 
= true;
        System.out.println("stop sun sub thread");
    }
}


 

 

/**//**
 * ShutdownDownHook测试类
 * 
 * @author Administrator
 * 
 
*/

public class TestShutdownHook extends Thread {
    TestThread testThread;

    
public void addThread(TestThread t) {
        testThread 
= t;
    }

    
/**//**
     * 实现程序退出前的清理工作
     
*/

    
public void run() {
        System.out.println("This 
is ShutdownHook");
        testThread.onTerminal();
    }

    
public static void main(String[] args) {
        TestShutdownHook m 
= new TestShutdownHook();
        TestThread t 
= new TestThread();
        t.start();
        m.addThread(t);
        
// 注册退出处理线程
        Runtime.getRuntime().addShutdownHook(m);
    }
}

 

运行结果:

 

run sub thread
run sub thread
run sub thread
run sub thread
This is ShutdownHook
stop sun sub thread

 

可以看到:当程序退出时启动了TestThread线程,执行了定义的释放工作。

 

利用ShutdownHook释放系统资源

当发生 System.exit(int status) 时,希望在系统退出前,执行一点任务来做一些资源方面的回收操作,ShutdownHook 可以达到这个目的,它利用 hook 的思路来实现,有些时...
  • pengjunlee
  • pengjunlee
  • 2017年06月02日 16:33
  • 10615

Java利用ShutDownHook关闭系统资源

Java关闭钩子在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源的功能。 使用Runtime.addShutdownHook(Thread hook)向JVM添加关闭钩子 pub...
  • jaune161
  • jaune161
  • 2015年06月09日 10:00
  • 9684

JAVA虚拟机关闭钩子(Shutdown Hook)

Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。 JDK提供了Java...
  • u013256816
  • u013256816
  • 2015年12月24日 15:48
  • 13969

随记:安全地关闭 jvm(tomcat停止钩子事件处理)

在jvm中,java.lang.Runtime 有一个方法,public void addShutdownHook(Thread hook) {},此方法始于jdk1.3,用于在jvm关闭时执行一些命...
  • zhanlanmg
  • zhanlanmg
  • 2015年12月28日 13:44
  • 2416

Spring: 使用关闭钩子销毁bean

Spring中关于bean的销毁有三种方法。分别是 1)执行某一方法如destroy()方法,然后在标签上的destroy-method属性制定方法名就行了。 2)实现DisopableB...
  • bigtree_3721
  • bigtree_3721
  • 2016年02月29日 00:32
  • 3361

如何让JAVA应用在Eclipse中也能调用shutdownhook

大家都知道 Eclipse的红色的Terminate按钮是强制关闭程序,她无法触发shutdownhook 关机钩,就像在linux下执行kill -9 一样的效果,那么,难道我们没有任何措施了吗?答...
  • jiangguilong2000
  • jiangguilong2000
  • 2014年04月23日 00:26
  • 2779

java ShutdownHook(钩子线程)

在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。   JDK在1.3...
  • qilixiang012
  • qilixiang012
  • 2015年05月11日 15:52
  • 2233

如何为JVM添加关闭钩子与简要分析

最近在看当当开源的数据库分库分表框架Sharding-jdbc的源码,在看ExecutorEngine类时,遇到了很多没用过的JDK api,Sharding-jdbc内部大量的使用了google的工...
  • jackyechina
  • jackyechina
  • 2016年09月30日 18:12
  • 1952

java虚拟机钩子关闭函数addShutdownHook

当jvm虚拟机被关闭的时候,可能我们需要做一些处理,比如对连接的关闭,或者对一些必要信息的存储等等操作,这里就可以借助于虚拟机提供的钩子函数,当jvm虚拟机关闭之前会去调用addShutdownHoo...
  • qq_20641565
  • qq_20641565
  • 2017年11月24日 14:49
  • 209

Java 进程的退出机制与Shutdown hook

基本概念进程与线程:一个进程包含多个线程,一个进程中所有线程都退出后,该进程才会退出。用户线程与守护线程:任一用户线程未退出,JVM进程不退出,当所有用户线程都退出时, 守护线程线程自动退出。Shu...
  • Revivedsun
  • Revivedsun
  • 2017年08月22日 01:14
  • 712
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关闭钩子(ShutdownHook)
举报原因:
原因补充:

(最多只允许输入30个字)