Вызов метода Java Finalize при закрытии приложения
У меня есть вопрос относительно метода финализации. Если у меня много классов с множеством наследований, как я могу вызвать все методы finalize при закрытии приложения?
4 ответа
System.runFinalizersOnExit(true)
, но обратите внимание, что это устарело. Если вы полагаетесь на такого рода вещи, вы уже делаете что-то не так в принципе.
finalize()
методы не запускаются при выходе из приложения.
Рекомендуемый подход заключается в использовании крюка отключения.
например
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
Отключение выполняется, когда:
- программа выходит нормально, например System.exit
- пользовательское прерывание, например, ввод ^C, выход из системы или выключение системы
Java также предлагает метод под названием, runFinalizersOnExit()
который был @deprecated
, Это устарело по следующей причине:
Это может привести к вызову финализаторов для живых объектов, в то время как другие потоки одновременно манипулируют этими объектами, что приводит к ошибочному поведению или тупику
По существу, runFinalizersOnExit()
небезопасно Используйте крюк отключения, как я описал выше.
Если вам нужно почистить вещи, закрыть файл журнала, отправить какое-либо предупреждение или предпринять какие-либо другие действия, когда виртуальная машина Java завершает работу, особенно если кто-то нажимает CTRL+C и выключает виртуальную машину, или отправляет сигнал уничтожения в Unix/Linux вы должны посмотреть на ShutdownHook.
Хук отключения - это просто инициализированный, но незапущенный поток. Когда виртуальная машина начинает свою последовательность выключения, она запускает все зарегистрированные обработчики завершения работы в неустановленном порядке и позволяет им запускаться одновременно. Когда все перехватчики завершены, он запустит все непроверенные финализаторы, если финализация при выходе была включена. Наконец, виртуальная машина остановится. Обратите внимание, что потоки демона будут продолжать работать во время последовательности завершения работы, также как и потоки, не являющиеся демонами, если завершение работы было инициировано путем вызова метода выхода.
Не лучше полагаться на finalize() для очистки ресурсов в JVM.
Из Javadoc.
Вызывается сборщиком мусора на объекте, когда сборщик мусора определяет, что больше нет ссылок на объект. Подкласс переопределяет метод finalize для удаления системных ресурсов или выполнения другой очистки.
Редактировать: см. Этот блог об использовании finalize()