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

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

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

Запустите, если из командной строки, выполнив следующую команду в командной строке:

java -jar "MyJar.jar"

Двойным щелчком на этом файле jar.

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

Это приложение из командной строки.

И не появляется окно командной строки, когда пользователь дважды нажимает на файл jar. Итак, в этом случае работает Ctrl + C?

Остановка (выход) приложения должна находиться внутри приложения. Независимо от того, является ли это командной строкой или графическим интерфейсом, разработчик приложения должен написать код для выхода из него (например, в приложении с командной строкой вы можете иметь что-то вроде Press 5 to exit , Press Esc to Exit и т.д.) И в приложении с графическим интерфейсом, вам нужно будет написать код для выхода, когда окно будет закрыто, или кнопку EXIT (или другие, в зависимости от вашего приложения)

Ctrl + C — это приложение KILL. Это не нормальный выход. Для приложений с графическим интерфейсом пользователь обычно (в Windows) переходит в диспетчер задач и завершает процесс (аналогичные способы в других операционных системах)

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

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

Читайте также:  Как заработать деньги на вкладах

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

Это прочно работает для нас в производстве. Для этого вам нужна настоящая Sun JRE; тот, который поставляется с типичным дистрибутивом Linux, не содержит в себе сигнала. Он работает нормально и в Windows, но вы не получаете сигнал HUP. Для запуска этой вещи вам понадобится ярлык или shellscript.

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

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

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

У нас есть многопоточное java приложение, работающее с web и базой. Мы шлем ему kill pid.
Как произойдет завершение текущих работающих потоков?
Можно ли с помощью try-catch выполнить что-то при остановке, например отослать запрос на адрес или записать что-то в базу?
Что произойдет с java приложением при вызове kill -9 ?

  • Вопрос задан более года назад
  • 208 просмотров
Читайте также:  Как слить слои в фотошопе горячие клавиши

Один из классических способов обработки остановки java-приложения, как сказали выше — Runtime.getRuntime().addShutdownHook. В свою очередь в нем можно подать команду на остановку всем остальным потокам, либо используя флаг "interrupt" класса Thread, либо используя в рабочих потоках предусмотрительно заведенный собственный флаг остановки.

Соответственно, останавливаемые потоки должны либо периодически проверять флаг остановки, либо корректно обрабатывать InterruptedException.

Пример с флагом "interrupt"

try-catch вполне можно использовать для стандартного 15-го (SIGTERM) сигнала (kill pid)

но 9й сигнал перехватить нельзя — ядро системы прибьет процесс сразу, try/catch будет проигнорирован.

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

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

используя System.exit(); Иногда я использовал его. Я прочитал о Sytem.exit() из Этот вопрос.

Итак, я знаю немного о них обоих. Но я все еще смущен тем, как они на самом деле работают. Пожалуйста, проверьте коды ниже.

Я уверен, что 2 не появится. Я хотел бы знать, почему return; или другие коды могут писать ниже утверждение System.exit(0); и что было реальным определением для return; (потому что для меня это странно для меня return без каких-либо переменных или значений)?

Вызов System.exit(0) (или любое другое значение в этом случае) приводит к тому, что виртуальная машина Java завершает работу, завершая текущий процесс. Параметр, который вы передадите, будет возвращаемым значением, которое процесс java вернется в операционную систему. Вы можете выполнить этот вызов из любой точки вашей программы — и результат всегда будет таким же — JVM завершается. Поскольку это просто вызов статического метода в классе System , компилятор не знает, что он будет делать — и, следовательно, не жалуется на недостижимый код.

Читайте также:  Изменить горячие клавиши word

return просто отменяет выполнение текущего метода. Это буквально означает возврат элемента управления вызывающему методу. Если метод объявлен как void (как в вашем примере), вам не нужно указывать значение, так как вам нужно вернуть void . Если метод объявлен для возврата определенного типа, тогда вы должны указать возвращаемое значение — и это значение должно быть указанного типа.

return приведет к выходу программы только в том случае, если она находится внутри метода main основного класса. Если вы попытаетесь поместить код после него, компилятор будет жаловаться на недостижимый код, например:

не будет компилироваться с большинством компиляторов, создавая ошибку unreachable code , указывающую на второй вызов System.out.println .

Потому что System.exit() — это еще один метод для компилятора. Он не читает заранее и не выясняет, что вся программа завершится в этот момент (JVM завершает работу). Ваша ОС или оболочка могут читать целое число, которое передается обратно в методе System.exit() . Стандартно для 0 означает "завершение программы, и все прошло нормально" и любое другое значение для уведомления об ошибке. Разработчик должен документировать эти возвращаемые значения для любых пользователей.

return С другой стороны, это зарезервированное ключевое слово, которое компилятор хорошо знает. return возвращает значение и завершает текущий запуск функции, перемещая резервную копию стека к функции, которая его вызывала (если таковая имеется). В приведенном выше коде возвращается void , поскольку вы не предоставили ничего для возврата.

Ссылка на основную публикацию
Как обжать коннектор rj 45 без обжимки
В этой инструкции я покажу как обжать сетевой кабель LAN и изготовить интернет кабель своими руками без инструмента. Вместо кримпера...
Как на авито найти продавца по имени
Avito – интернет-сервис для продажи и покупки товаров, предложения услуг, поиска работы. Начинающий пользователь может быстро освоить функции ресурса благодаря...
Как на айпаде включить два экрана
Режим разделенного экрана очень полезен, поскольку позволяет держать открытыми одновременно два приложения на устройстве, независимо от того, требуется ли открыть...
Как обменять клеверсы на деньги
За «Клеверсы» можно не только покупать дополнительные возможности в ежедневной викторине, но приобретать товары и продукты питания. Начисляется валюта за...
Adblock detector