该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.