ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

"Корректное завершение работы Java-приложения: гайд"

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если необходимо завершить работу Java-приложения, следует использовать метод System.exit(0).

Java
Скопировать код
System.exit(0); // До свидания, приложение, тебя вспомнят

При этом не забудьте, что если вы используете графический интерфейс, перед завершением приложения стоит закрыть все окна, освободив таким образом системные ресурсы. Это аналогично тому, как перед демонтажом дома из него нужно вынести все ценное:

Java
Скопировать код
for(Frame frame : Frame.getFrames()) {
    frame.dispose(); // Дальше здесь делать нечего, идите дальше
}
System.exit(0); // Вот и финал!

Сделайте так, чтобы ваше приложение, перед тем как завершить работу, корректно освободило все занятые ресурсы, как после большого праздничного мероприятия!

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Объясняем System.exit()

System.exit() — это простой способ прекратить работу Java-приложения. В качестве аргумента ему предается код завершения:

  • System.exit(0); означает, что все прошло гладко и задание было выполнено успешно.
  • System.exit(код, отличный от нуля); указывает на наличие проблем.

Что насчет ресурсов?

Также, как идеальный шпион, ваше приложение должно уметь бесследно освободить занятые ресурсы, такие как файлы и соединения:

Java
Скопировать код
try (Resource resource = new Resource()) { 
    // Ваш код
} // Ресурс автоматически освободится

А для осуществления завершающих действий используйте метод shutdown():

Java
Скопировать код
public void shutdown() { 
    // Подготовка приложения к закрытию
}

В случае возникновения исключения не забудьте выполнить очистку в блоке finally:

Java
Скопировать код
try {
    // Код, в котором потенциально может возникнуть ис EXCEPTION
} finally {
    shutdown(); // Выполнение завершающих действий
}

Управление фоновыми потоками

Фоновые потоки могут удерживать работу приложения:

  • Вызовите interrupt(), чтобы дать потоку команду на остановку.
  • Регулярно проверяйте Thread.isInterrupted(), чтобы может узнать, когда ему нужно остановиться.
Java
Скопировать код
thread.interrupt(); // Время прощаться

Учтите, что обычные потоки требуют особого внимания, поскольку они могут продолжать работу до завершения всех процессов.

Работа с графическим интерфейсом

Для GUI-приложений требуется более тщательный подход:

  • Остановите обработку событий интерфейса.
  • Сгенерируйте событие закрытия окна для корректной остановки работы.
Java
Скопировать код
WindowEvent we = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(we); // Пожелайте "Do svidania"

Когда лучше избегать System.exit()

Не используйте System.exit(), если есть вероятность потери данных или когда ваш код работает в контейнере и для завершения работы программы предусмотрены инные механизмы.

Вместо System.exit() можно использовать хуки завершения работы:

Java
Скопировать код
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    // Завершающие действия перед остановкой программы
}));

Визуализация

Представьте свое Java-приложение в виде космической миссии:

🚀 Командный центр: Ваше Java-приложение

System.exit(0); — это кнопка "Завершение миссии".

До: 🚀🔥🌌 (Приложение занято выполнением миссии) Эвакуация: 💺🛑🌌 (Процесс завершения начат) После: 🌠🛬🏠 (Приложение "приземлилось", задача выполнена)

Внимательное завершение работы

Выйдите из приложения аккуратно и внимательно:

  • Очистите фоновые процессы.
  • Заботьтесь о целостности данных.
  • Гарантируйте уведомление о завершении работы приложения.

Оптимальный путь завершения работы

Перед выходом:

  • Сохраните пользовательские настройки и состояние приложения.
  • Убедитесь, что все транзакции с базой данных завершены.
  • Если вы используете сервисы аутентификации, корректно завершите работу с ними.

Продуманный дизайн процесса завершения работы

Шаблоны проектирования и корректная архитектура сильно упростят процесс:

  • Шаблон наблюдатель для оповещения о завершении работы.
  • Шаблон стратегия для различных вариантов завершения работы.
  • Тщательное управление ресурсами для предотвращения остаточных "помех".

Тестирование процесса завершения работы

Тестирование процесса завершения работы поможет обнаружить:

  • Незавершенные процедуры освобождения ресурсов.
  • Взаимные блокировки и другие проблемы параллелизма.
  • Необходимость во временных ограничениях для ожидания окончательных операций.

Прощание с компонентами

При завершении работы:

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

Полезные материалы

  1. System (Java Platform SE 8)
  2. Runtime (Java Platform SE 8)
  3. Platform (JavaFX 11)
  4. The try-with-resources Statement
  5. Когда стоит вызывать System.exit в Java – Stack Overflow
  6. Обработка сигналов на Oracle Solaris и Linux
  7. Daemon – Daemon: Демоны или сервисы на основе Java