Описание тега shutdown-hook
public void addShutdownHook(Thread hook)
Регистрирует новую ловушку завершения работы виртуальной машины.
Виртуальная машина Java выключается в ответ на два типа событий:
Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод exit (эквивалентно System.exit), или виртуальная машина завершается в ответ на пользовательское прерывание, такое как ввод ^C или событие, такое как выход пользователя из системы или выключение системы. Ловушка выключения - это просто инициализированный, но не запущенный поток. Когда виртуальная машина начинает свою последовательность выключения, она запускает все зарегистрированные перехватчики выключения в некотором неопределенном порядке и позволяет им работать одновременно. Когда все хуки завершатся, он запустит все неактивированные финализаторы, если финализация при выходе была включена. Наконец, виртуальная машина остановится. Обратите внимание, что потоки демонов будут продолжать работать во время последовательности завершения работы, как и потоки, не являющиеся демонами, если завершение работы было инициировано вызовом метода выхода.
После того, как последовательность выключения началась, ее можно остановить, только вызвав метод halt, который принудительно завершает работу виртуальной машины.
Как только последовательность выключения началась, невозможно зарегистрировать новую ловушку выключения или отменить регистрацию ранее зарегистрированной ловушки. Попытка любой из этих операций вызовет исключение IllegalStateException.
Перехватчики завершения работы запускаются в деликатный момент жизненного цикла виртуальной машины, и поэтому их следует кодировать с учетом защиты. В частности, они должны быть написаны так, чтобы обеспечивать потокобезопасность и, насколько это возможно, избегать взаимоблокировок. Им также не следует слепо полагаться на службы, которые, возможно, зарегистрировали свои собственные перехватчики отключения и, следовательно, сами могут завершать работу. Попытки использовать другие службы на основе потоков, такие как, например, поток диспетчеризации событий AWT, могут привести к тупикам.
Крюки отключения также должны быстро завершить свою работу. Когда программа вызывает exit, ожидается, что виртуальная машина сразу же выключится и выйдет. Когда виртуальная машина завершается из-за выхода пользователя из системы или завершения работы системы, базовая операционная система может предоставить только фиксированное время для завершения работы и выхода. Поэтому не рекомендуется предпринимать какие-либо действия с пользователем или выполнять длительные вычисления в ловушке завершения работы.
Неперехваченные исключения обрабатываются в перехватчиках завершения работы так же, как в любом другом потоке, путем вызова метода uncaughtException объекта ThreadGroup потока. Реализация по умолчанию этого метода выводит трассировку стека исключения в System.err и завершает поток; это не приводит к завершению или остановке виртуальной машины.
В редких случаях виртуальная машина может прекратить работу, то есть перестать работать без правильного завершения работы. Это происходит, когда виртуальная машина завершается извне, например, с помощью сигнала SIGKILL в Unix или вызова TerminateProcess в Microsoft Windows. Виртуальная машина также может прервать работу, если собственный метод не работает, например, из-за повреждения внутренних структур данных или попытки доступа к несуществующей памяти. Если виртуальная машина аварийно завершает работу, нельзя гарантировать, будут ли запущены какие-либо перехватчики завершения работы.