Лучший способ изящно завершить программу командной строки Java - PullRequest
23 голосов
/ 22 июня 2009

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

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

  1. Откройте порт и дождитесь соединения. Когда все сделано, изящно выключите.
  2. Следите за созданием файла, затем выключайте.
  3. Считывание некоторого ввода с терминала, например «выполнить отключение».

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

Ответы [ 7 ]

20 голосов
/ 22 июня 2009

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

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

редактирование:

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

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

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

9 голосов
/ 22 июня 2009

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

EDIT

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

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

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

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

3 голосов
/ 22 июня 2009

Если вы хотите использовать версию сокета, это очень просто реализовать. Вот код:

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

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

2 голосов
/ 22 июня 2009

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

1 голос
/ 22 июня 2009

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

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

0 голосов
/ 22 июня 2009

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

...