Главная » Java » stop Java

0

В главе 8 мы упоминали о двух известных категориях асинхронных исключений – внутренних ошибках виртуальной машины Java и исключениях, генерируемых при вызове метода Thread.stop, не рекомендованного для применения.

На страницах книги мы не уделяем внимания устаревшим и получившим официальное неодобрение методам, но stop – это случай особый, частично ввиду назначения этого метода, но в большей мере из-за того, что вам наверняка придется встречаться с ситуациями, где он используется.

Вызов метода stop приводит к возникновению в соответствующем потоке асинхронного исключения типа ThreadDeath. Этот тип исключения не отличается ничем особенным – его объекты могут быть отловлены точно так же, как и другие, а если исключение не подвергается обработке, последствия такого бездействия со временем приведут к аварийному завершению работы потока. Исключение типа ThreadDeath может проявиться в любой момент на протяжении рабочего цикла потока, но только не при выполнении операции захвата блокировки.

Исходный замысел при создании метода stop состоял в обеспечении способа завершения работы потока контролируемым образом. Выбрасывая исключение, которое вряд ли будет обрабатываться, метод, как предполагалось, позволял бы выполнить необходимые завершающие операции в рамках предложений finallу по мере обратной "раскрутки" стека вызовов потока. Но благие намерения остались нереализованными. Метод, во-первых, не в состоянии заставить любой поток прервать выполнение, поскольку поток способен отловить выброшенное исключение и пренебречь им; следовательно, эта мера как средство противодействия "злокозненному" коду, вообще говоря, неэффективна. Во-вторых, вместо того, чтобы обеспечить контролируемое выполнение завершающих операций, метод в действительности допускает порчу объектов. Если stop вызвать в то время, когда поток пребывает в критической секции, при передаче исключения во внешний код блокировка будет освобождена, но объект может остаться в некорректном состоянии из-за частичного завершения инструкций критической секции. После обнаружения упомянутых серьезных изъянов было рекомендовано отказаться от применения метода stop. Вместо него следует использовать interrupt, позволяющий завершать работу Потоков более цивилизованным образом.

Вторая разновидность метода stop предполагает получение в качестве параметра любого объекта Throwable, который будет выброшен в Виде объекта исключения в соответствующем потоке, – это еще более коварное решение, поскольку оно допускает возможность генерирования "недопустимых" объявляемых исключений в пределах кода, где они на самом деле не объявлены.

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

По теме:

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