Как захватить событие System.exit?
Вопрос
У меня есть приложение на Java, в котором я пытаюсь гарантировать, что если кто-то выйдет из кода System.exit() в коде, должен быть вызван прослушиватель для выполнения некоторых действий, таких как регистрация сообщения и освобождение ресурсов...
Как я могу это реализовать, любые предложения/подходы приветствуются.
Решение
В Runtime.addShutdownHook
можно использовать для добавления перехватчика завершения работы, который по сути представляет собой незапущенный Thread
, который выполняется при завершении работы виртуальной машины Java.
Однако на этой территории следует действовать осторожно, поскольку она выполняется в очень чувствительный период жизненного цикла JVM.Из спецификаций API для Runtime.addShutdownHook
метод:
Крючки отключения работают в деликатное время в жизненном цикле виртуальной машины и, следовательно, должны быть кодированы оборонительно.Они должны, в в частности, быть написаны, чтобы быть поток-безопасный и избежать тупиков насколько это возможно.
В любом случае обязательно прочитайте немного о том, как работают перехватчики выключения, поскольку к ним, вероятно, не следует подходить без хорошей подготовки.Обязательно внимательно прочтите спецификацию API для Runtime.addShutdownHook
метод.
Вот пара статей, которые я нашел в поисках информации для этого ответа:
Перехватчики выключения -- здесь показан небольшой пример того, как добавляется перехватчик завершения работы для регистрации при завершении работы.
Проектирование API перехватчиков выключения -- рассматривает некоторые дизайнерские решения обработчиков завершения работы в стиле вопросов и ответов.
Другие советы
Функция Runtime.addShutdownHook(Thread thehook)
позволяет вам зарегистрировать перехватчик в виртуальной машине Java.
Перехватчик работает как инициализированный, но не запущенный поток, который будет вызван JVM при выходе.Если вы регистрируете более одного перехватчика, обратите внимание, что порядок вызова перехватчиков не определен.