Подтвердить что ты не робот

Лучший способ изящно закрыть программу командной строки Java

Мне интересны разные подходы к изящному завершению программы командной строки Java. Отправка сигнала уничтожения не является вариантом.

Я могу придумать несколько разных подходов.

  • Откройте порт, ожидая подключения. Когда он сделан, изящно выключается.
  • Следите за создаваемым файлом, а затем выключите его.
  • Прочитайте некоторые данные с терминала, такие как "выполнить выключение"

Третий вариант не идеален, так как часто на экран выводится программный вывод. Первый требует слишком много усилий (я ленив). Использует ли большинство программистов второй вариант? Если нет, то что еще возможно/элегантно/просто?

Спасибо заранее. Mike

4b9b3361

Ответ 1

вы можете попробовать что-то вроде этого:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() { /*
       my shutdown code here
    */ }
 });

изменить

Ключ отключения не будет выполнять закрытие приложения. вместо этого он дает разработчику возможность выполнить любую очистку, которую он/она желает при выключении.

из JavaDoc для Runtime (хорошее чтение, если вы планируете использовать этот метод):

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

Ответ 2

вы можете попробовать использовать Runtime.getRuntime().addShutdownHook(), который должен удовлетворять вашим требованиям. Таким образом, вы можете зарегистрировать крючок для очистки, чтобы выполнить грациозное завершение работы.

ИЗМЕНИТЬ

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) public void addShutdownHook (Thread hook) Регистрирует новый виджет остановки виртуальной машины. Виртуальная машина Java отключается в ответ на два вида событий:

  • Программа завершается нормально, когда последний поток не-daemon выходит или когда вызывается метод exit (эквивалентно, System.exit) или
  • Виртуальная машина завершается в ответ на прерывание пользователя, например, набирает ^ C или общесистемное событие, такое как выход из системы или выключение системы.

Ответ 3

Преимущество второго варианта - проверка файла - по первому - прослушивание на порту - заключается в том, что у вас есть определенная возможность безопасности.

Вы можете установить разрешения в каталоге, в котором создается файл, чтобы только соответствующие пользователи могли закрыть программу. Если вы прослушиваете порт, любой пользователь может подключиться к нему.

Ответ 4

Первые два варианта просты в реализации. Вы также можете использовать некоторые вещи JMX (я мало знаю об этом). Tomcat использует первый подход, и я применил 1 и 2 в двух моих проектах.

Ответ 5

Если вы хотите пойти с версией сокета, его очень просто реализовать. Здесь код:

ServerSocket server = new ServerSocket(8080);
System.out.println("Socket listening!");
server.accept();
System.out.println("Connection received!");

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

Ответ 6

Рассмотрим наличие JMX-компонента. Затем вы можете подключаться с помощью JConsole либо локально, либо через сеть и обмениваться данными с вашим компонентом. Затем компонент может нормально завершить работу программы.

С помощью Java 6 u 10 или более поздней версии вы можете сделать то же самое с JVisualVM.

Ответ 7

Я бы посоветовал использовать крюк остановки. Это позволит контролировать вашу программу с помощью стандартных инструментов ОС. Он также не нуждается в дополнительном доступе к внешним ресурсам (диск, порты и т.д.).