Внезапно затваряне на Java приложение как да избегнем всичко свързано с ИТ и програмиране

Написано на 15 юли 2006 г. Публикувано в Java

СЪДЪРЖАНИЕ

В много случаи се надявате, че потребителят ще затвори приложението по начин, който е приемлив за вас. Например, в първия случай можете да му предоставите компонент JButton, след щракване върху който се извършват необходимите финални операции и приложението директно излиза. Като алтернатива можете да окачите манипулатор на събития на прозорец, който обработва събитието windowClosing. Tomcat, от друга страна, използва специален пакетен файл, който може да бъде изпълнен, когато приложението излезе правилно. Въпреки това е добре известно, че потребителите не затварят приложенията правилно толкова често. Те могат да правят каквото искат с приложенията. В допълнение, потребителят може просто да затвори конзолата или да прекрати сесията си с операционната система, оставяйки вашето приложение отворено. В Java виртуалната машина излиза в два случая: първо, когато приложението се излезе по нормалния начин, т.е. методът System.exit е бил извикан или когато е оставена последната нишка, която не е демон. Второ, когато потребителят внезапно прекрати виртуалната машина, например чрез натискане на клавишната комбинация Ctrl + C или излизане от системата, без първо да затвори работещото Java приложение.

За щастие, VM следва следната двуфазова последователност, преди да се разтовари: 1. Виртуалната машина изпълнява всички регистрирани капани за изключване, ако има зададени такива. Кукичките за изключване са нишки, които са регистрирани в класа Runtime. Всички тези капани ще бъдат стартирани и ще работят паралелно, докатовсички те няма да свършат работата си. 2. Виртуалната машина извиква всички дефинирани операции за финализиране (ако има подходящи). Ще разгледаме първата точка в тази статия, защото тя позволява на програмиста да натовари JVM с необходимите операции за прекратяване на приложението. Капаните за изключване са просто екземпляри на класове, които наследяват от класа Thread. За да създадете такъв капан, трябва да изпълните следната последователност от действия: 1. Опишете клас, който наследява класа Thread. 2. Приложете метода run на този нов клас. Този метод съдържа кода, който ще бъде изпълнен за изключване на виртуалната машина, независимо дали приложението е прекратено нормално или не. 3. Свържете класа на куката за изключване с вашето приложение. 4. Регистрирайте кука с помощта на метода addShutdownHook на текущия екземпляр на класа Runtime. Както може би сте забелязали, не е необходимо да стартирате закачащата нишка, която току-що създадохте, тъй като бихте стартирали друг клас, който наследява Thread. Задачата за стартиране на тази нишка е оставена на виртуалната машина, която, след като се приближи до изпълнението на своята последователност на изключване, ще стартира всички регистрирани нишки на кука.