Java Shutdown Hook2024 年 8 月 29 日 | 5 分钟阅读 一种特殊的构造,用于方便开发人员添加在 Java 虚拟机 (JVM) 关闭时必须运行的代码,称为 Java shutdown hook。当 JVM 关闭时,Java shutdown hook 在需要执行一些特殊清理工作时非常有用。请注意,使用通用构造处理诸如在 JVM 终止之前调用特殊方法之类的操作,在 JVM 由于某些外部因素而关闭时不起作用。例如,每当操作系统生成终止请求,或由于内存不足导致资源未分配时,在这种情况下,无法调用该过程。Shutdown hook 通过提供任意代码块来舒适地解决此问题。 表面上看,学习 shutdown hook 是直接的。只需派生一个类,使用 java.lang.Thread 类,然后在 run() 方法中提供要在 JVM 关闭时执行的任务代码。要将派生类的实例注册为 shutdown hook,需要调用 Runtime.getRuntime().addShutdownHook(Thread) 方法,而要删除已注册的 shutdown hook,需要调用 removeShutdownHook(Thread) 方法。 总之,shutdown hook 可用于在 JVM 正常或异常关闭时执行清理资源或保存状态。执行清理资源意味着关闭日志文件、发送警报或其他内容。因此,如果您想在 JVM 关闭之前执行一些代码,请使用 shutdown hook。 JVM 何时关闭?当以下情况发生时,JVM 关闭:
addShutdownHook(Thread hook) 方法Runtime 类的 addShutdownHook() 方法用于向虚拟机注册线程。 语法 可以通过调用静态工厂方法 getRuntime() 来获取 Runtime 类的对象。例如 removeShutdownHook(Thread hook) 方法调用 Runtime 类的 removeShutdownHook() 方法来删除已注册的 shutdown hooks 的注册。 语法 如果方法成功取消注册已注册的挂钩,则该方法返回 true 值;否则返回 false。 工厂方法返回类实例的方法称为工厂方法。 Shutdown Hook 的简单示例文件名: MyThread.java 输出 Now main sleeping... press ctrl+c to exit shut down hook task completed. 匿名类的 Shutdown Hook 同一示例文件名: TestShutdown2.java 输出 Now main sleeping... press ctrl+c to exit shut down hook task completed. 删除已注册的 shutdown hook 示例以下示例演示了如何使用 removeShutdownHook() 方法删除已注册的 shutdown hook。 文件名: RemoveHookExample.java 输出 The program is beginning ... Waiting for 2 seconds ... The program is terminating ... 注意事项在使用 shutdown hook 时,需要注意一些重要事项。 不保证执行 shutdown hook:第一件也是最重要的一点是要记住,shutdown hook 的执行是不确定的。在某些情况下,shutdown hook 根本不会执行。例如,如果 JVM 由于某种内部错误而崩溃,那么 shutdown hook 就没有余地了。当操作系统发出 SYSKILL 信号时,shutdown hook 也无法起作用。 请注意,当应用程序正常终止时,会调用 shutdown hook(应用程序的所有线程都已完成或终止)。此外,当操作系统关机或用户按 Ctrl + C 时,会调用 shutdown hook。 可以在完成之前强制停止 shutdown hook:这是上面讨论过的点的一个特殊情况。每当 shutdown hook 开始执行时,都可以通过关闭系统来强制终止它。在这种情况下,操作系统会在特定时间内运行。如果在该时间范围内未完成任务,则系统别无选择,只能强制终止正在运行的 hook。 可以有多个 shutdown hook,但不能保证它们的执行顺序:JVM 可以按任意顺序执行 shutdown hook。甚至 shutdown hook 的并发执行也是可能的。 在 shutdown hook 中,不允许取消注册或注册 shutdown hook:当 JVM 启动关闭顺序时,不能添加或删除任何现有的 shutdown hook。如果尝试这样做,JVM 将抛出 IllegalStateException。 Runtime.halt() 可以停止已启动的关闭序列:只有 Runtime.halt()(强制终止 JVM)才能停止已启动的关闭序列,这意味着在 shutdown hook 中调用 System.exit() 方法将不起作用。 使用 shutdown hook 时需要安全权限:如果使用 Java Security Manager,那么负责添加或删除 shutdown hook 的 Java 代码需要在运行时获得 shutdown hook 权限。如果在安全环境中调用该方法而未获得权限,则会引发 SecurityException。 下一个主题多线程中的多任务处理 |
我们请求您订阅我们的新闻通讯以获取最新更新。