Крюк выключения, как отличить нормальное и резкое (пользователем) выключение

В моем приложении я добавил крючок выключения для некоторой очистки и завершения последней транзакции. Как указано во всех документах, этот хук также вызывается при «нормальном» завершении работы - если все завершено.

Но я хочу дать пользователю обратную связь:

"Обнаружено сочетание клавиш ctrl-c - попытка завершения..."

Этот отзыв я хочу дать только при «внезапном» отключении.

Итак, есть ли способ определить тип выключения в хуке выключения?


person dermoritz    schedule 11.11.2013    source источник


Ответы (1)


Как я уже рассматривал эту тему ранее, Ctrl-C — это обычное событие выключения (как kill -15 <pid> в Linux). Поэтому ваш хук выключения должен работать.

Из javadoc (для Runtime.addShutdownHook()): "

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

Программа завершается нормально, когда завершается последний поток, не являющийся демоном, или когда вызывается метод выхода (эквивалентно System.exit), или

Виртуальная машина завершается в ответ на прерывание пользователя, например ввод ^C, или общесистемное событие, такое как выход пользователя из системы или завершение работы системы.

".

Но также есть необработанное завершение работы (например, kill -9 <pid> в Linux), в этом случае нет возможности его поймать и обработать. Процесс (JVM) будет уничтожен на уровне ОС, и для приложения не будет сгенерирован никакой сигнал.

person Nikolay Antipov    schedule 11.11.2013
comment
я отредактировал заголовок своего вопроса: мне нужно определить, инициировал ли пользователь отключение. - person dermoritz; 11.11.2013