为Java应用程序添加退出事件响应

 更新时间:2006年10月13日 00:00:00   作者:  
一个完整的Java应用程序,通常至少要有一个应用程序的结束点。对于一般程序来说,系统开发者根据需要和个人的偏好,会在程序结束位置,通过添加System.exit(0),或System.out(-1),来结束程序,或不加这些指令,让程序自然运行到结束。

  如:下列典型代码

  package untitled14;

  /**
  * This application is to demo how an applcation end
  */
  public class Test {
  public Test() {}
  public static void main(String[] args) {
  Test test1 = new Test();
  //.................
  System.out.println("hello world");
  //Do something before system exit
  System.exit(0);//也可以不写这句代码,让程序自然结束。
  }
  }

  对于简单的应用系统,我们直接可以在System.exit(0)代码执行前,添加需要在应用程序退出前需要完成的工作,如:关闭网络连接,关闭数据库连接等。

  然而,对于比较复杂的多线程应用,线程运行的状态较复杂,我们就很难预料程序何时结束,如何能在应用程序结束事件到来时,处理我们要做的工作呢?这就用到了Java对应用程序的退出的事件出处理机制。

  对当前应用程序对象的获得,Java通过Runtime静态方法:Runtime.getRuntime()通过Runtime的 void addShutdownHook(Thread hook) 法向Java虚拟机注册一个shutdown钩子事件,这样一旦程序结束事件到来时,就运行线程hook,我们在实际应用时候,只要将程序需要完成之前做的一些工作直接通过线程hook来完成。具体演示代码如下:

  /*****************************************************************************
  本程序仅演示,如何在Java应用程序中添加系统退出事件处理机制
  *****************************************************************************/
  package untitled14;
  import java.util.*;
  import java.io.*;

  /**
  * This application is used to demo how to hook the event of an application
  */
  public class Untitled1 {

  public Untitled1() {
  doShutDownWork();
  }

  /***************************************************************************
  * This is the right work that will do before the system shutdown
  * 这里为了演示,为应用程序的退出增加了一个事件处理,
  * 当应用程序退出时候,将程序退出的日期写入 d:\t.log文件
  **************************************************************************/
  private void doShutDownWork() {
  Runtime.getRuntime().addShutdownHook(new Thread() {

   public void run() {
    try {
     FileWriter fw = new FileWriter("d:\\t.log");
     System.out.println("Im going to end");
     fw.write("the application ended! " + (new Date()).toString());
     fw.close();
    }
    catch (IOException ex) {
    }

   }
  });
  }

  /****************************************************
  * 这是程序的入口,仅为演示,方法中的代码无关紧要
  ***************************************************/

  public static void main(String[] args) {
  Untitled1 untitled11 = new Untitled1();
  long s = System.currentTimeMillis();
  for (int i = 0; i < 1000000000; i++) {
   //在这里增添您需要处理代码
  }
  long se = System.currentTimeMillis();
  System.out.println(se - s);
  }
  }

  在上述程序中,我们可以看到通过在程序中增加Runtime.getRuntime().addShutdownHook(new Thread()) 事件监听,捕获系统退出消息到来,然后,执行我们所需要完成工作,从而使我们的程序更健壮!

相关文章

  • 让JSP页面过期, 保证每次JSP页面都是最新的.

    让JSP页面过期, 保证每次JSP页面都是最新的.

    让JSP页面过期, 保证每次JSP页面都是最新的....
    2006-10-10
  • jsp实现上一页下一页翻页功能(示例代码)

    jsp实现上一页下一页翻页功能(示例代码)

    下面小编就为大家带来一篇jsp实现上一页下一页翻页功能(示例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • JSP简单添加,查询功能代码

    JSP简单添加,查询功能代码

    这篇文章主要介绍了JSP简单添加,查询功能代码,以实例形式分析了JSP实现简单添加及查询功能的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • java eclipse 启动参数

    java eclipse 启动参数

    其实,Eclipse是一个可以进行非常灵活配置的系统,除了以缺省的方式启动以外,还可以指定各种参数来定制启动方式。
    2009-04-04
  • JSP的setProperty的使用方法

    JSP的setProperty的使用方法

    这篇文章主要介绍了JSP的setProperty的使用方法的相关资料,希望通过本文能帮助到大家,让大家理解应用setProperty,需要的朋友可以参考下
    2017-10-10
  • JSP 自定义标签实现数据字典的实例

    JSP 自定义标签实现数据字典的实例

    这篇文章主要介绍了JSP 自定义标签实现数据字典的实例的相关资料,这里实现这样的功能,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • JSP判断移动设备的正则

    JSP判断移动设备的正则

    天猫php判断移动设备的正则(个人猜测),觉得很好用,于是就决定移植到JSP里面,大家可以参考下
    2014-03-03
  • Java下使用Oracle存储过程(详解)

    Java下使用Oracle存储过程(详解)

    其实,这篇短文,我早就应该写了。因为,java存储过程今后在各大数据库厂商中越来越流行,功能也越来越强大。这里以Oracle为例,介绍一下java存储过程的具体用法。
    2008-09-09
  • JavaBeans程序开发

    JavaBeans程序开发

    JavaBeans程序开发...
    2006-10-10
  • jsp Unsupported encoding: gb2312 错误原因

    jsp Unsupported encoding: gb2312 错误原因

    今天做了一个JSP页面,运行时tomcat提示:org.apache.jasper.JasperException: Unsupported encoding: gb2312 错误,找了很久才找到出错的地方,原来是一个空格惹的祸。
    2009-06-06

最新评论