Главная » Java » Потоки-ловушки события закрытия системы

0

 

  Приложение вправе зарегистрировать ловушки события закрытия исполняющей системы (shutdown hooks) — специальные объекты потоков вычислений, которые представляют последовательности действий, подлежащих выполнению перед тем, как виртуальная машина завершит работу. Такие потоки, например, обычно высвобождают занятые приложением внешние ресурсы — дескрипторы открытых файлов и сетевые соединения.

 

public void addShutdownHook  (Thread hook)

Регистрирует новый объект потока-ловушки события закрытия исполняющей системы. Если поток hook прежде регистрировался либо уже приступил к работе, выбрасывается исключение типа IllegalArgumentException.

public boolean  removeShutdownHook  (Thread hook)

Отменяет регистрацию ранее зарегистрированного объекта потока-ловушки. Возвращает true, если операция выполнена успешно, и false — если объект hook раньше не был зарегистрирован.

Методы нельзя вызывать после начала процедуры закрытия исполняющей системы — в противном случае выбрасывается исключение типа Illegal StateException.

   После инициирования процесса виртуальная машина вызывает методы start объектов Thread всех зарегистрированных потоков-ловушек. Полагаться на некий порядок вызова методов нельзя — один поток-ловушка может быть активизирован прежде остальных, после них или единовременно с другими потоками в соответствии с общим внутренним расписанием работы потоков. Об отсутствии строгого порядка активизации потоков-ловушек забывать не следует. Пусть, например, создается класс, объект которого сохраняет свое состояние в базе данных. В нем могут быть предусмотрены средства регистрации потока-ловушки, выполняющего закрытие базы данных. Но программе, использующей этот класс, может потребоваться зарегистрировать свой собственный поток-ловушку, который записывает в базу некоторую итоговую информацию. Если поток-ловушка, предусмотренный в коде класса, выполнится первым (т.е. закроет базу данных), поток прикладной программы возложенную на него миссию выполнить не сможет. Чтобы избежать подобной ситуации, следует предусмотреть в составе класса средства повторного открытия базы данных, если это действительно необходимо (хотя такое решение отнюдь не упростит код класса и наверняка создаст условия возникновения нежелательных эффектов конкуренции потоков), либо спроектировать класс таким образом, чтобы полностью обойтись без использования потоков-ловушек.

   Помимо того, важно сознавать, что потоки-ловушки, реагирующие на событие закрытия исполняющей системы, будут выполняться на конкурентной основе наряду с другими потоками. Если закрытие инициируется ввиду завершения выполнения последнего пользовательского (user) потока, потокам-ловушкам, возможно, придется конкурировать с оставшимися потоками-демонами (daemon). Если же причиной возникновения события закрытия системы служит вызов метода exit, потоки-ловушки будут выполняться одновременно с потоками-Демонами и пользовательскими потоками. Код потоков-ловушек должен быть Написан   настолько   тщательно,   чтобы   обеспечить   выполнение   необходимых функций синхронизации (synchronization) и исключить возможность проявления эффектов взаимоблокировки (deadlock).

   Следует также учесть, что код потоков-ловушек обязан выполняться по возможности быстро. Пользователь, прерывающий выполнение программы, вправе надеяться на скорую реакцию системы. А если виртуальная машина останавливается из-за выхода пользователя из системы либо перезагрузки или выключения компьютера, в ее распоряжении — до момента неминуемой "смерти" — остается весьма незначительное время, в течение которого следует успеть выполнить все необходимое (взаимодействие системы с пользователем надлежит выполнять до события ее закрытия, но никак не в ходе этого процесса).

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии