Раптове закриття Java-програми як цього уникнути все про IT та програмування

Written on 15 Липня 2006 . Posted in Java

ЗМІСТ

У багатьох випадках ви сподіваєтеся на те, що користувач закриє програму прийнятним для вас способом. Наприклад, у першому випадку ви можете надати йому компонент JButton, після кліка на який виконуються необхідні завершальні операції та здійснюється безпосередньо вихід із програми. Як альтернативний варіант ви можете повісити обробник події вікна, який обробляв би подію windowClosing. Tomcat використовує спеціальний batch-файл, який може бути виконаний при правильному завершенні роботи з додатком. Однак добре відомо, що користувачі не так часто коректно завершують роботу з додатками. Вони можуть робити з додатками все, що забажають. Крім цього, користувач може просто закрити консоль або завершити свій сеанс роботи з операційною системою, залишивши при цьому ваш додаток незакритим. В Java віртуальна машина завершує роботу у двох випадках: по-перше, коли з програми вийшли в нормальний спосіб, тобто. був викликаний метод System.exit, або коли залишився останній потік, що не є демоном. По-друге, коли користувач раптово перериває роботу віртуальної машини, наприклад, натискаючи комбінацію клавіш Ctrl+C або ж виходячи з системи, не закривши попередньо працюючу Java-додаток.

На щастя, віртуальна машина слідує наступної двофазної послідовності дій, перш ніж вивантажити себе: 1. Віртуальна машина запускає всі зареєстровані shutdown-пастки, якщо такі були встановлені. Shutdown-пастки - це нитки (threads), які реєструються за допомогою класу Runtime. Всі ці пастки будуть запущені і працюватимуть паралельно доти, докиусі вони не завершать своєї роботи. 2. Віртуальна машина викликає всі певні fina-lize-операції (якщо є відповідні). У цій статті ми розглянемо перший пункт, оскільки він дозволяє програмісту спантеличити віртуальну Java-машину виконанням необхідних операцій із завершення програми. Shutdown-пастки - це просто екземпляри класів-спадкоємців класу Thread. Щоб створити таку пастку, потрібно виконати таку послідовність дій: 1. Описати клас, що успадковує клас Thread. 2. Здійснити реалізацію методу run цього нового класу. Цей метод містить код, який і буде виконуватися для завершення роботи віртуальної машини незалежно від того, нормально чи ні було завершено програму. 3. Зв'язати клас shutdown-пастки з вашим додатком. 4. Зареєструвати пастку за допомогою методу addShutdownHook поточного екземпляра класу Runtime. Як ви вже могли помітити, вам не потрібно запускати щойно створену нитку пастки, як ви б запускали інший клас, що успадкував Thread. Турбота про запуск цієї нитки лягає на віртуальну машину, яка, підійшовши до виконання своєї shutdown-послідовності, запустить усі зареєстровані нитки пасток.