Главная » Java » Завершение работы приложения Java

0

 

Каждое приложение начинает работу с одним потоком – под управлением этого тока работает метод main. Если затем приложение не создает других потоков, его выполнение прекращается при выходе из main. Но если в приложении предусмотрено создание дополнительных потоков, что с ними случится при завершении main?

Существуют два вида потоков – пользовательские (user) и потоки-демоны (daemon). Наличие пользовательских потоков сохраняет приложение в работающем состоянии. Когда выполнение последнего из пользовательских потоков завершается, деятельность всех демонов прерывается и приложение финиширует. Прерывание работы демонов схоже с вызовом метода destroy – оно происходит внезапно и не оставляет потокам никаких шансов для выполнения завершающих операций, – поэтому демоны ограничены в выборе функциональных возможностей. Чтобы придать потоку "демоническое" обличие, используется вызов setDaemon(true). Проверить принадлежность потока к категории демонов можно с помощью метода isDaemon. По умолчанию "демонический" статус наследуется потоком от потока-"родителя" в момент создания и после старта не. может быть изменен; попытка вызова setDaemon(true) во время работы потока приводит к выбрасыванию исключения типа IllegalThreadStateException.

Если метод main порождает потоки, им по умолчанию присваивается статус пользовательских. По завершении main приложение продолжает работать до тех пор, пока не финишируют оставшиеся пользовательские потоки. Исходный поток, вообще говоря, ничем не отличается от остальных – просто ему пришлось оказаться первым в конкретной сессии работы программы – и трактуется системой точно так же, как и другие пользовательские потоки. Обычно при проектировании исходному потоку ставится задача дать "жизнь" другим потокам, призванным выполнить конкретные действия, и затем "умереть". Если необходимо, чтобы приложение заканчивало работу вместе с исходным потоком, все другие потоки следует создавать в форме демонов.

Чтобы заставить приложение завершить работу, можно воспользоваться методами ехit из состава классов System или Runtime. Каждый из этих методов прерывает выполнение приложения и действует подобно методу destroy, применяемому к каждому отдельному потоку. Приложение, однако, способно запустить специальные потоки, которые должны выполниться перед завершением его работы (соответствующие методы, позволяющие осуществлять подобные функции, перечислены в разделе 18.3 на странице 504).

Многие классы создают потоки внутри приложения неявным образом. Например, пакет Abstract Window Toolkit (AWT), кратко описанный в главе 20, обеспечивает поддержку графического пользовательского интерфейса, управляемого событиями, и его классы создают специальные потоки, обслуживающие все события интерфейса. В классах пакета Remote Method Invocation (RMI), который рассмотрен в той же главе 20, предусмотрено создание потоков, ответственных за реализацию механизмов удаленного вызова процедур. Одни из потоков формируются в виде демонов, другие относятся к категории пользовательских, так что при использовании подобных классов Приложение способно действовать дольше, чем можно было предположить. В таких Случаях, когда не существует иных способов завершения работы про грамм, наличие методов ехit приобретает особое значение.

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

По теме:

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