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>

li 程序正常退出,当最后一个非守护程序线程退出或调用 > 方法时,或

<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 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于