Java控制台程序如何在用户关闭时执行清理代码

Java控制台程序如何在用户关闭时执行清理代码
通过
Runtime.getRuntime(). addShutdownHook( Thread hook)
方法可以给当前的进程注册一个清理线程,当进程退出的时候,会执行线程中的代码。

1、为了统一清理线程的实现,可以做一个Destroyable接口,实现此接口的类都有一个destroy()方法,里面包含了该类的清理过程,例如关闭数据库连接、关闭Socket连接等。
Destroyable接口的代码:
 1  package  net.blogjava.amplifier;
 2 
 3  /**
 4   * 建立此接口的目的是为了实现程序退出时的清理
 5   * 在Java控制台程序中,用户可以通过关闭命令行窗口或按下Ctrl+C来结束程序的运行
 6   * 这时候应该保证资源能够被正确释放,例如数据库的连接、Socket的连接应该关闭
 7   * 实现了本接口的类的实例引用可以由一个ShutdownHook线程来操作
 8   * 此线程在虚拟机退出时执行,详见Runtime.addShutdownHook()方法
 9   *  @author  amplifier
10   *
11    */
12  public   interface  Destroyable {
13       /**
14       * 实现本接口的类需要实现此方法,方法中包含该类的清理代码,
15       * 例如关闭数据库连接、关闭Socket连接等
16       *
17        */
18       void  destroy();
19  }

2、建立一个继承于Thread的类ShutdownHook,里面的一个域是Destroyable实现类的引用,在该类的构造函数中可以传入该Destroyable实现类。
ShutdownHook的代码:
 1  package  net.blogjava.amplifier;
 2 
 3  public   class  ShutdownHook  extends  Thread {
 4 
 5       private  Destroyable desObj;
 6      
 7       public  ShutdownHook(Destroyable desObj){
 8           this .desObj  =  desObj;
 9              }
10      
11      @Override
12       public   void  run() {
13           if ( this .desObj != null ){
14               try {
15                   this .desObj.destroy();
16              }
17               catch  (Exception e) {
18              }
19          }
20      }
21 
22       /**   *//**
23       *  @param  args
24        */
25       public   static   void  main(String[] args) {
26      
27 
28      }
29 
30  }

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


你可能感兴趣的:(Java控制台程序如何在用户关闭时执行清理代码)