Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - JVM 停止钩子



JVM 关闭

以下是两种不同的 JVM 关闭方式:

  • 受控过程:如果调用了System.exit() 方法,按下 CTRL+C,或最后一个非守护线程终止,则 JVM 开始关闭其进程。

  • 突然方式:如果 JVM 收到终止信号,调用了Runtime.getRuntime().halt() 方法,或发生任何类型的操作系统恐慌,则 JVM 开始关闭其进程。

JVM 停止钩子

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

JVM 停止钩子:addShutdownHook(Thread hook) 方法

Runtime addShutdownHook(Thread hook) 方法注册一个新的虚拟机停止钩子。

声明

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

public void addShutdownHook(Thread hook)

参数

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

返回值

此方法不返回值。

异常

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

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

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

JVM 停止钩子的示例

在此示例中,我们通过扩展 Thread 类创建一个名为 CustomThread 的类。此线程对象将用作 JVM 停止钩子。CustomThread 类具有 run() 方法的实现。在主类 TestThread 中,我们使用 Runtime.getRuntime().addShutdownHook() 方法添加了一个停止钩子,方法是将线程对象传递给它。在输出中,您可以验证当程序即将退出时是否调用了 CustomThread run() 方法。

package com.tutorialspoint;

class CustomThread extends Thread {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         // register CustomThread as shutdown hook
         Runtime.getRuntime().addShutdownHook(new CustomThread());
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

输出

Program is starting...
Waiting for 3 seconds...
Program is closing...
JVM is shutting down.

更多 JVM 停止钩子的示例

示例 1

在此示例中,我们通过实现 Runnable 接口创建一个名为 CustomThread 的类。此线程对象将用作 JVM 停止钩子。CustomThread 类具有 run() 方法的实现。在主类 TestThread 中,我们使用 Runtime.getRuntime().addShutdownHook() 方法添加了一个停止钩子,方法是将线程对象传递给它。在输出中,您可以验证当程序即将退出时是否调用了 CustomThread run() 方法。

package com.tutorialspoint;

class CustomThread implements Runnable {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         // register CustomThread as shutdown hook
         Runtime.getRuntime().addShutdownHook(new Thread(new CustomThread()));
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

输出

Program is starting...
Waiting for 3 seconds...
Program is closing...
JVM is shutting down.

示例 2

我们也可以使用 removeShutdownHook() 删除停止钩子。在此示例中,我们通过实现 Runnable 接口创建一个名为 CustomThread 的类。此线程对象将用作 JVM 停止钩子。CustomThread 类具有 run() 方法的实现。在主类 TestThread 中,我们使用 Runtime.getRuntime().addShutdownHook() 方法添加了一个停止钩子,方法是将线程对象传递给它。作为最后一条语句,我们使用 Runtime.getRuntime().removeShutdownHook() 方法删除了钩子。

package com.tutorialspoint;

class CustomThread implements Runnable {
   public void run() {
      System.out.println("JVM is shutting down.");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      try {
         Thread hook = new Thread(new CustomThread());
         // register Message as shutdown hook
         Runtime.getRuntime().addShutdownHook(hook);
         // print the state of the program
         System.out.println("Program is starting...");
         // cause thread to sleep for 3 seconds
         System.out.println("Waiting for 3 seconds...");
         Thread.sleep(3000);
         // print that the program is closing
         System.out.println("Program is closing...");
		  Runtime.getRuntime().removeShutdownHook(hook);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

输出

Program is starting...
Waiting for 3 seconds...
Program is closing...
广告