Язык

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 объект

Атрибуты

Исключения

Значение

Если виртуальная машина уже завершает работу.

Комментарии

Регистрирует новый перехватчик завершения работы виртуальной машины.

Виртуальная машина Java завершает работу в ответ на два типа событий:

<Ул>

<li> Программа завершается обычно, когда последний поток, отличный от управляющей программы, завершается или когда #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 или вызовом TerminateProcess на Microsoft Windows. Виртуальная машина также может прервать, если собственный метод идет сбой, например повреждение внутренних структур данных или попытка получить доступ к несуществующей памяти. Если виртуальная машина прервана, то никаких гарантий о том, будут ли выполняться перехватчики завершения работы, не могут быть выполнены.

Добавлено в версии 1.3.

Java документации по java.lang.Runtime.addShutdownHook(java.lang.Thread).

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

Применяется к