`

java thread 退出时的清理工作:Runtime.getRuntime().addShutdownHook

阅读更多
样例:


package thread;

public class CleanThead {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DestroyableImpl di = new DestroyableImpl();
        ShutdownHook sh = new ShutdownHook(di);
        Runtime.getRuntime().addShutdownHook(sh);
       
        Thread t=new Thread(){
            public void run(){
                System.out.println("第二波清理……");
            }
        };
      
        Runtime.getRuntime().addShutdownHook(t);
       
        di.setDaemon(true);
        di.start();
        System.out.println("Main closed !");
    }

}
class ShutdownHook extends Thread {

    private Destroyable desObj;
  
    public ShutdownHook(Destroyable desObj){
        this.desObj = desObj;
            }
  
    @Override
    public void run() {
        if(this.desObj!=null){
            try{
                this.desObj.destroy();
            }
            catch (Exception e) {
            }
        }
    }


}
 
 class DestroyableImpl extends Thread implements Destroyable {

      
      
        public DestroyableImpl(){
             
                }
      
        @Override
        public void run() {
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("业务运行……");
           
        }
        public void destroy(){
            System.out.println("正在清理……");
        }
 
    }
 
  interface Destroyable {
        /**
         * 实现本接口的类需要实现此方法,方法中包含该类的清理代码,
         * 例如关闭数据库连接、关闭Socket连接等
         *
         */
        public void destroy();
    }







参考:http://www.nq3721.cn/commons/product/ProductView.aspx?productCD=28

通过Runtime.getRuntime().addShutdownHook(Thread hook)
方法可以给当前的进程注册一个清理线程,当进程退出的时候,会执行线程中的代码。

1、为了统一清理线程的实现,可以做一个Destroyable接口,实现此接口的类都有一个destroy()方法,里面包含了该类的清理过程,例如关闭数据库连接、关闭Socket连接等。
Destroyable接口的代码:
package net.blogjava.amplifier;

/**
 * 建立此接口的目的是为了实现程序退出时的清理
 * 在Java控制台程序中,用户可以通过关闭命令行窗口或按下Ctrl+C来结束程序的运行
 * 这时候应该保证资源能够被正确释放,例如数据库的连接、Socket的连接应该关闭
 * 实现了本接口的类的实例引用可以由一个ShutdownHook线程来操作
 * 此线程在虚拟机退出时执行,详见Runtime.addShutdownHook()方法
 * @author amplifier
 *
 */
public interface Destroyable {
    /**
     * 实现本接口的类需要实现此方法,方法中包含该类的清理代码,
     * 例如关闭数据库连接、关闭Socket连接等
     *
     */
    void destroy();
}
2、建立一个继承于Thread的类ShutdownHook,里面的一个域是Destroyable实现类的引用,在该类的构造函数中可以传入该Destroyable实现类。
ShutdownHook的代码:
package net.blogjava.amplifier;

public class ShutdownHook extends Thread {

    private Destroyable desObj;
   
    public ShutdownHook(Destroyable desObj){
        this.desObj = desObj;
            }
   
    @Override
    public void run() {
        if(this.desObj!=null){
            try{
                this.desObj.destroy();
            }
            catch (Exception e) {
            }
        }
    }

    /** *//**
     * @param args
     */
    public static void main(String[] args) {

    }

}
3、在main()方法中注册ShutdownHook。
    public static void main(String[] args){
        DestroyableImpl di = new DestroyableImpl();
        ShutdownHook sh = new ShutdownHook(di);
        Runtime.getRuntime().addShutdownHook(sh);
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run(){
                System.out.println("正在退出……");
            }
        });
        di.otherMethod();
    }

 

 

 

 

分享到:
评论

相关推荐

    深入研究java.lang.Runtime类.doc

    一般不能实例化一个 Runtime 对象,应用程序也不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前 Runtime 运行时对象的引用。 一旦得到了一个当前的 Runtime 对象的引用,就可以调用 Runtime ...

    ShutdownHook-Java优雅停机解决方案.docx

    ShutdownHook 的实现代码非常简单,只需要使用 Runtime.getRuntime().addShutdownHook(Thread) 方法,并传入一个线程对象,该线程对象将会在 JVM 关闭时被执行。在这个线程对象中,我们可以执行清理操作,例如保存...

    解析Runtime中shutdown hook的使用详解

    在Java编程中,`Runtime`类的`shutdownHook`是一个重要的特性,它允许开发者在Java虚拟机(JVM)即将关闭时执行清理任务。本文将深入解析`shutdown hook`的使用,以及它在不同场景下的应用。 首先,`shutdown hook`...

    java 程序的退出的资源

    你可以通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的`Thread`,在程序退出前进行必要的清理工作,如关闭文件流、释放网络连接等。 此外,Java还提供了`Thread.stop()`和`Thread.interrupt...

    thrift服务端和客户端实现Nifty.zip

    Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { server.stop(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); } Or ...

    Runtime 源码分析

    `Runtime`类是单例的,意味着每个Java应用都有一个与之关联的`Runtime`实例,可以通过`Runtime.getRuntime()`获取。 `Runtime`类的主要功能包括: 1. **进程管理**: - `exec(String command)`: 这个方法用于启动...

    JAVA并发编程实践-线程的关闭与取消-学习笔记

    15. **关闭钩子(Shutdown Hook)**:通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的关闭钩子,这些钩子在JVM关闭时执行,用于清理资源。 16. **精灵线程(Daemon Thread)**:精灵线程是不...

    Java Runtime类详解_动力节点Java学院整理

    Runtime类的实例是全局的,每个Java应用程序都只有一个Runtime实例,通过`Runtime.getRuntime()`静态方法可以获取到这个实例。 一、Runtime类的内存管理 1. `totalMemory()`: 这个方法返回Java虚拟机当前分配的总...

    spring-rest-futures:在SpringBoot上使用SpringRest组成JVM期货(Guava,Java8,RxJava,Akka)

    SpringBoot Rest与以下库中​​的JVM Futures结合 ... Runtime.getRuntime().addShutdownHook(new Thread(SpringBootFuturesSimulation::shutdown)); new SpringApplicationBuilder(SpringWebFuturesAppl

    通过JDK源码分析关闭钩子详解

    在Java编程中,"关闭钩子"是一种重要的机制,它允许开发者在应用程序退出或中断时执行必要的清理任务。关闭钩子,也称为Shutdown Hooks,确保即使在非正常退出的情况下,特定的代码块仍能得到执行。本文将深入探讨...

    Java利用WatchService监听文件变化示例

    Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { watchService.close(); } catch (Exception e) { } })); } } ``` 上述代码首先定义了一个名为TestWatchService的类和main方法。在main方法...

    shutdown-app

    可以使用`Runtime.getRuntime().addShutdownHook(Thread hook)`来添加一个钩子。 5. **Spring Boot应用关闭**: - 如果"shutdown-app"是在Spring Boot环境下,那么可能涉及到`@PreDestroy`注解,它标记在方法上,...

    neo4j安装配置入门教程

    Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { graphDb.shutdown(); } }); } public static void main(String[] args) throws IOException { // 清除旧数据库 ...

Global site tag (gtag.js) - Google Analytics