Share via


Runtime.AddShutdownHook(Thread) 方法

定义

注册新的虚拟机关闭挂钩。

[Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")]
public virtual void AddShutdownHook (Java.Lang.Thread? hook);
[<Android.Runtime.Register("addShutdownHook", "(Ljava/lang/Thread;)V", "GetAddShutdownHook_Ljava_lang_Thread_Handler")>]
abstract member AddShutdownHook : Java.Lang.Thread -> unit
override this.AddShutdownHook : Java.Lang.Thread -> unit

参数

hook
Thread

已初始化但未启动 Thread 的对象

属性

例外

如果挂钩已启动或已注册,则为 。

如果 VM 已关闭,则为 。

注解

注册新的虚拟机关闭挂钩。

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

<ul>

<程序> 正常 退出 ,当最后一个非守护程序线程退出或 #exit exit (等效时, System#exit(int) System.exit) 方法被调用,或者

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

</ul>

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

关闭序列开始后,只能通过调用 #halt halt 强制终止虚拟机的方法来停止它。

关闭序列开始后,无法注册新的关机挂钩或取消注册以前注册的挂钩。 尝试上述任一操作都会导致 IllegalStateException 引发 。

关闭挂钩在虚拟机生命周期中的敏感时间运行,因此应进行防御性编码。 具体而言,应将其写入为线程安全,并尽可能避免死锁。 它们也不应盲目依赖可能注册了自己的关闭挂钩的服务,因此它们本身可能在关闭过程中。 例如,尝试使用其他基于线程的服务(例如 AWT 事件调度线程)可能会导致死锁。

关机挂钩也应该快速完成其工作。 当程序调用 #exit exit 时,预期虚拟机会立即关闭并退出。 当虚拟机因用户注销或系统关闭而终止时,基础操作系统可能只允许一定的时间才能关闭和退出。 因此,尝试任何用户交互或在关机挂钩中执行长时间运行的计算是不可行的。

未捕获的异常在关闭挂钩中进行处理,就像在任何其他线程中一样,方法是调用 ThreadGroup#uncaughtException uncaughtException 线程 ThreadGroup 对象的 方法。 此方法的默认实现将异常的堆栈跟踪打印到 System#err 并终止线程;它不会导致虚拟机退出或停止。

在极少数情况下,虚拟机可能会 中止,也就是说,在不完全关闭的情况下停止运行。 当虚拟机在外部终止时(例如 SIGKILL Unix 上的信号或 Microsoft Windows 上的调用) TerminateProcess 时,会发生此情况。 如果本机方法损坏内部数据结构或尝试访问不存在的内存,则虚拟机也可能中止。 如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。

在 1.3 中添加。

java.lang.Runtime.addShutdownHook(java.lang.Thread)Java 文档。

此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。

适用于