Java中的JVM关闭挂钩

java.lang.Runtime.addShutdownHook(挂线)方法注册新的虚拟机来关闭hook.The Java虚拟机关闭响应两种事件。

  • 当最后一个非守护程序线程退出时,或者调用exit(等效于System.exit)方法时,程序将正常退出,或者

  • 响应于用户中断(例如键入^ C)或系统范围的事件(例如用户注销或系统关闭)来终止虚拟机。

关闭钩子只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以未指定的顺序启动所有已注册的关闭挂钩,并使其同时运行。当所有挂钩完成后,如果启用了退出时终结,则它将运行所有未调用的终结器。最后,虚拟机将停止。请注意,如果关闭是通过调用exit方法启动的,则守护程序线程将在关闭序列期间继续运行,非守护程序线程也将继续运行。

声明

以下是java.lang.Runtime.addShutdownHook()方法的声明

public void addShutdownHook(Thread hook)

参数

-一个初始化但尚未启动的Thread对象。

返回值

此方法不返回值。

例外

  • IllegalArgumentException-如果指定的挂钩已经被注册,或者可以确定挂钩已经在运行或已经在运行。

  • IllegalStateException-如果虚拟机已经在关闭过程中。

  • SecurityException-如果存在安全管理器并且它拒绝RuntimePermission(“ shutdownHooks”)。

示例

以下示例显示了lang.Runtime.addShutdownHook()方法的用法。

package com.nhooo;
public class RuntimeDemo {
   //扩展程序退出时要调用的线程的类
   static class Message extends Thread {
      public void run() {
         System.out.println("Bye.");
      }
   }
   public static void main(String[] args) {
      try {
         //将消息注册为关机钩子
         Runtime.getRuntime().addShutdownHook(new Message());
         //打印程序状态
         System.out.println("Program is starting...");
         //使线程休眠3秒
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         //打印程序正在关闭
         System.out.println("Program is closing...");
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

让我们编译并运行以上程序,这将产生以下结果。

输出结果

Program is starting...
Waiting for 3 seconds...
Program is closing...
Bye.