我什么时候需要调用此方法Runtime.getRuntime()。addShutdownHook()

时间:2012-01-04 06:21:24

标签: java

我什么时候需要调用此方法Runtime.getRuntime()。addShutdownHook()以及何时或为何需要关闭我的应用程序。有谁可以通过举一些例子来解释我。

由于

3 个答案:

答案 0 :(得分:37)

据我所知,我将在下面解释。您可以谷歌搜索并查找大量信息。

addShutdownHook()将注册一些将在程序终止时执行的操作。您开始的程序以两种方式结束:

  1. 主线程(Root)结束其运行上下文;
  2. 该程序遇到一些意外情况,因此无法继续进行。
  3. 如果添加ShutdownHook,则挂钩将启动一个仅在终止时开始运行的线程。例如:

     Runtime.getRuntime().addShutdownHook(new Thread() {
          public void run() {
            System.out.println("Running Shutdown Hook");
          }
        });
    

    会在程序终止时打印Running Shutdown Hook。您甚至可以拨打System.exit(0)

    例如,你可以谷歌,有足够的。问题“你什么时候应该使用此功能”就像是问catch语句中的try-catch做了什么。

    您可能会遇到以下情况:

    • 您的程序在要删除的文件系统中创建了许多临时文件;
    • 您需要在终止前向另一个进程/机器发送遇险信号;
    • 对意外行为执行任何清理操作,记录或错误后操作。

    有些时候需要这一切。

    例如,您可以访问Example 1Example 2

答案 1 :(得分:9)

当您希望在虚拟机上发生关闭时发生某些事情时,您只担心关闭挂钩。

来自Javadoc

  

Java虚拟机关闭以响应两种   事件:

     
      
  • 当最后一个非守护程序线程退出或调用退出(等效,System.exit)方法时,程序正常退出,或者
  •   
  • 虚拟机终止以响应用户中断,例如键入^ C或系统范围的事件,例如用户注销或   系统关闭。
  •   

因此,关闭挂钩是一个初始化未启动线程,在JVM关闭时执行。

应用程序服务器(例如JBoss AS)中存在关闭挂钩的常见示例。当您按 Ctrl + C 时,JVM会在退出之前调用所有已注册的Runtime关闭挂钩(例如JBoss关闭挂钩)。

答案 2 :(得分:2)

一种情况是,如果您需要在jvm关闭之前停止任何守护程序线程(或)任何其他后端线程(主要是守护程序线程)需要正常退出,您将编写shutdown hook并使用上面的代码执行它。以下是我们几天前所做的有趣讨论。 Shutdown hook