Thread
, и передаются в Runtime.getRuntime().addShutdownHook()
.При использовании обработчика нужно учитывать ряд нюансов:
- Нет гарантии, что он будет выполнен целиком, и выполнен вообще. Хуки вызываются при нормальном завершении программы – завершении всех пользовательских потоков или вызове
System.exit()
. Например вызовSystem.halt()
или получение от системы SIGKILL программа завершится незамедлительно. Это может случиться как до выполнения обработчиков, так и во время. Сигнал SIGTERM запустит обработчики, но ОС может не дождаться завершения и оборвать процесс. - В хуке нельзя использовать System.exit(0). Завершить работу можно ненулевым кодом, или методом
System.halt()
. Возврат нулевого кода после старта хуков приведет к зависанию программы. - Набор обработчиков задается до их старта. Когда процесс обработки начался, новый вызов
addShutdownHook()
вызовет исключение. - Нет гарантий о порядке выполнения. Если обработчиков несколько, они могут вызываться в случайном порядке, и даже параллельно, в соседних потоках. Об этом намекает и форма объявления обработчика – класс
Thread
.
Больше деталей об особенностях обработчиков смотрите в официальных вопросах и ответах о Shutdown Hooks API.