Как остановить работу программы java

Я сделал приложение Java и упаковал его в исполняемый файл JAR. Теперь пользователь может запустить эту программу одним из следующих двух способов:

  1. Запустите if из командной строки, выполнив в командной строке следующую команду: java -jar «MyJar.jar»
  2. Двойным щелчком по файлу 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. Вам нужен ярлык или сценарий для запуска этой вещи.

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

Читайте также:
Версия программы 32 или 64 разрядная

Другой подход — структурировать вашу программу как сервлет. Вы напишите класс, который расширяет HttpServlet в этом случае. Переопределите Servlet.init с помощью метода, который запускает ваш рабочий поток. Аналогично, переопределите Servlet.destroy с помощью метода, который отключает себя.

Затем вы можете использовать сервер-контейнер Java EE, такой как Tomcat, для управления запуском и остановкой.

Источник: stackru.com

Русские Блоги

Завершение работы программы Java

я узнал, как завершить (выключить или остановить) мои Java-программы. Я нашел два решения.

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

автор: 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru