Главная » Java » Последовательность операций закрытия системы

0

 

   Последовательность операций закрытия исполняющей системы инициируется в тех случаях, когда завершает выполнение последний из пользовательских (user) потоков вычислений, вызывается метод Runtime.exit либо сигнал об окончании работы поступает от внешнего источника. К работе приступают потоки-ловушки события закрытия исполняющей системы (shutdown hooks) (см. предыдущий раздел). Если выполнение любого из потоков-ловушек заканчивается неудачей, последовательность операций закрытия не считается завершенной: если причиной возникновё- * ния события послужил внутренний источник, виртуальная машина остановлена не будет; если же закрытие было спровоцировано "извне", неудача при выполнении последовательности завершающих операций способна привести к принудительной форсированной остановке виртуальной машины.

   Если поток-ловушка выбрасывает необрабатываемое исключение (uncaught exception), никакие специальные действия не предпринимаются — как обычно, вызывается метод uncaughtException объекта ThreadGroup, который соответствует потоку вычислений, виновному в происшедшем. Это, в частности, не приводит к прекращению последовательности операций закрытия.

  По завершении выполнения последнего из потоков-ловушек вызывается метод Runtime.halt, который и вынуждает виртуальную машину прекратить работу. Метод в качестве параметра принимает целочисленный код завершения (exit value); его назначение аналогично тому, которому соответствует параметр метода exit: нуль свидетельствует о благополучном результате операции. Метод halt может быть вызван из кода потока-ловушки для принудительного прерывания последовательности действий по закрытию исполняющей системы. Непосредственное обращение к hal t — либо перед началом фазы закрытия, либо в процессе ее протекания — чревато опасными последствиями, поскольку оно препятствует успешной работе всех незавершенных потоков-ловушек. Вероятнее всего, что вы никогда не столкнетесь с ситуацией, когда прямой вызов halt можно было бы считать надежным решением, свободным от каких бы то ни было изъянов.

   Если в процессе выполнения последовательности операций по закрытию си темы вызывается exit, соответствующий поток-инициатор будет блокирован неопределенное время. Поскольку подобная ситуация никак не регламентируется, так поступать не рекомендуется.

   В  некоторых  редких обстоятельствах  виртуальная  машина способна завершать работу аварийно, не выполняя штатной последовательности операции закрытия. Это происходит, например, из-за внутренних ошибок в коде самой виртуальной машины. Кроме того, подобное развитие событий может быть спровоцировано и "извне" — скажем, при получении сигнала SIGKILL в UNIX-системе. Когда виртуальная машина вынуждена завершать работу таким образом, никаких гарантий, касающихся того, будет ли выполнена последовательность операций закрытия с активизацией потоков-ловушек или нет, дать нельзя.

 

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

По теме:

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