Я сделал приложение Java и упаковал его в исполняемый файл JAR. Теперь пользователь может запустить эту программу одним из следующих двух способов:
- Запустите if из командной строки, выполнив в командной строке следующую команду: java -jar «MyJar.jar»
- Двойным щелчком по файлу JAR.
Я хочу, чтобы мой клиент принял второй подход, так как он намного проще, чем первый. Но проблема со вторым подходом заключается в том, как остановить приложение до его завершения?
Это приложение командной строки.
И окно командной строки не появляется, когда пользователь дважды щелкает файл JAR. Так в этом случае, будет ли работать Ctrl + c?
user157027 07 ноя ’09 в 13:35 2009-11-07 13:35
2009-11-07 13:35
10 ответов
Остановка (выход) из приложения должна быть внутри приложения. Будь то командная строка или графический интерфейс, разработчик приложения должен написать код для его выхода (например, в приложении командной строки может быть что-то вроде Press 5 to exit , Press Esc to Exit и т. д.) и в приложении с графическим интерфейсом вам нужно будет написать код для выхода при закрытии окна или EXIT кнопка (или другие, в зависимости от вашего приложения)
Ctrl + C УБИТЬ приложение. Это не обычный выход. Для приложений с графическим интерфейсом пользователь обычно (в Windows) обращается к диспетчеру задач и завершает процесс (аналогично в других операционных системах)
Но это ненормальные выходы — когда пользователь хочет убить приложение, когда, например, приложение больше не отвечает. Нормальные выходы должны быть предоставлены приложением (и, следовательно, программист — вы)
user25949 07 ноя ’09 в 14:23 2009-11-07 14:23
2009-11-07 14:23
У меня была похожая проблема. У меня есть несколько программ на Java, которые в основном являются долго выполняющимися процессами демона. Приятно иметь возможность остановить их и сбросить (перезапустить) их.
Я использовал два подхода. Оба имеют свои преимущества и недостатки. Один из них — установить обработчик сигнала, поместив такую функцию в некоторый класс вашей программы (в моем случае это класс с методом main).
import sun.misc.Signal; import sun.misc.SignalHandler; . private static boolean stopNow = false; private static boolean restartNow = false; . private static void handleSignals() < try < Signal.handle(new Signal(«TERM»), new SignalHandler() < // Signal handler method for CTRL-C and simple kill command. public void handle(Signal signal) < MyClass.stopNow = true; >>); > catch (final IllegalArgumentException e) < logger.warn(«No SIGTERM handling in this instance.»); >try < Signal.handle(new Signal(«INT»), new SignalHandler() < // Signal handler method for kill -INT command public void handle(Signal signal) < MyClass.stopNow = true; >>); > catch (final IllegalArgumentException e) < logger.debug(«No SIGINT handling in this instance.»); >try < Signal.handle(new Signal(«HUP»), new SignalHandler() < // Signal handler method for kill -HUP command public void handle(Signal signal) < MyClass.restartNow = true; >>); > catch (final IllegalArgumentException e) < logger.warn(«No SIGHUP handling in this instance.»); >>
Это сработало для нас в производстве. Вам нужна настоящая Sun JRE, чтобы это работало; тот, который поставляется с типичным дистрибутивом Linux, не содержит в себе ничего от Signal. Он работает нормально и в Windows, но вы не получаете сигнал HUP. Вам нужен ярлык или сценарий для запуска этой вещи.
Кроме того, имейте в виду, что обработка сигналов — это большая жирная ошибка. Не пытайтесь делать очень много в вашем обработчике сигналов. Вы можете видеть, что мой пример кода просто устанавливает статические флаги. Другие части моей программы обнаруживают, что флаг изменился, и выключаются. Я мог бы поэкспериментировать с более сложным кодом в обработчике сигналов, но мне не хотелось брать на себя нагрузку по обеспечению качества.
Другой подход — структурировать вашу программу как сервлет. Вы напишите класс, который расширяет HttpServlet в этом случае. Переопределите Servlet.init с помощью метода, который запускает ваш рабочий поток. Аналогично, переопределите Servlet.destroy с помощью метода, который отключает себя.
Затем вы можете использовать сервер-контейнер Java EE, такой как Tomcat, для управления запуском и остановкой.
Источник: stackru.com
Русские Блоги
Завершение работы программы Java
я узнал, как завершить (выключить или остановить) мои Java-программы. Я нашел два решения.
- используя возврат;
когда я хочу выйти или завершить выполнение программы , я добавляю это. - используя
автор: Community
7 ответов
вызов System.exit(0) (или любое другое значение в этом отношении) заставляет виртуальную машину Java выйти, завершая текущий процесс. Параметр Pass будет возвращаемое значение, что java процесс вернется в операционную систему. Вы можете сделать этот вызов из любой точки вашей программы — и результат всегда будет одинаковым-JVM завершается. Как это просто вызов статического метода в System класса, компилятор не знает, что он будет делать — и, следовательно, не жалуется о недостижимом коде.
return оператор просто прерывает выполнение текущего метода. Это буквально означает верните элемент управления в вызывающий метод. Если метод объявлен как void (как в вашем примере), тогда вам не нужно указывать значение, так как вам нужно будет вернуть void . Если метод объявлен для возврата определенного типа, необходимо указать возвращаемое значение — и это значение должно быть указанного типа.
return приведет к выходу программы, только если она находится внутри main метод выполнения основного класса. Если вы попытаетесь поместить код после него, компилятор будет жаловаться на недостижимый код, например:
public static void main(String. str)
не будет компилироваться с большинством компиляторов unreachable code ошибка, указывающая на второй System.out.println звонок.
автор: Aleks G
, потому что System.exit() — Это еще один метод компилятора. Он не читает вперед и не понимает, что вся программа выйдет в этот момент (JVM завершает работу). Вашей ОС или оболочка может прочитать целое число, которое передается обратно в System.exit() метод. Это стандарт для 0 означает «программа завершила работу, и все прошло нормально», и любое другое значение для уведомления об ошибке. Разработчик должен документировать эти возвращаемые значения для любых пользователей.
return С другой стороны-это зарезервированное ключевое слово, которое компилятор хорошо знает. return возвращает значение и завершает выполнение текущей функции, перемещаясь вверх по стеку к функции, которая ее вызвала (если таковая имеется). В вашем коде выше он возвращает void поскольку вы ничего не предоставили, чтобы вернуться.
автор: indivisible
автор: prady00
Так return; на самом деле не завершает вашу программу java, он только завершает вашу функцию java (void). Поскольку в вашем случае функция является основной функцией вашего приложения, return; также завершит работу приложения. Но возврат; в вашем примере бесполезен, потому что функция все равно завершится сразу после этого возврата.
автор: ReeCube
return; действительно означает, что он ничего не возвращает void . Вот и все.
почему возвращение; или другие коды могут написать под заявлением системы.выход(0);
это разрешено, так как компилятор не знает вызова System.exit(0) приостановить JVM . Компилятор просто выдаст предупреждение — ненужный оператор возврата
автор: Keerthivasan
- Ну, первая система.exit (0) используется для завершения программы, и с инструкциями ниже это неправильно, хотя компилятор не выдает никаких ошибок.
- простой return; используется в методе типа void return для возврата управления выполнением родительскому методу.
Источник: askdev.ru