как остановить приложение java
System.exit(). Какой код выхода использовать?
Что является причиной того, что java программа прекращает любую свою активность и завершает свое выполнение? Основных причин может быть 2 (JLS Секция 12.8):
Именно значение 0 и возвращает JVM в первом, вышеописанном случае при своем завершении.
Как это можно проверить?
Тут нам на помощь приходит параметр командной строки ERRORLEVEL, который позволяет получить код выхода программы, которую мы запускали последней.
Как видим со скриншота код выхода равен 0.
Переходим ко второму случаю, с использованием метода exit().
Какие значения можно передавать в метод exit? Исходя из документации:
The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination.
Ага, варианта два: либо 0, либо любое ненулевое значение. Второй вариант можем разбить еще на два под варианта: любое отрицательное число и любое положительное число типа int.
Итак, пробуем вариант с 0:
Как видим, родительский процесс снова получил информацию об успешном завершении JVM.
А что же с nonzero значениями? Что, когда и в каком случае передавать?
Тут все просто — никаких требований для nonzero значений нету и следует руководствоваться лишь одним общим правилом:
System.exit() в Java – что это?
Java – язык программирования, имеющий множество приложений. При программировании для одного из этих приложений вы можете застрять на каком-то этапе этой программы. Что делать в этой ситуации? Есть ли способ выйти в этой самой точке? Если эти вопросы вас беспокоят, вы попали в нужное место.
Что вы можете сделать, это просто использовать метод System.exit(), который завершает текущую виртуальную машину Java, работающую в системе.
Как вы выходите из функции в Java?
Вы можете выйти из функции, используя метод java.lang.System.exit(). Этот метод завершает текущую запущенную виртуальную машину Java (JVM). Он принимает аргумент «код состояния», где ненулевой код состояния указывает на ненормальное завершение.
Если вы работаете с циклами Java или операторами switch, вы можете использовать операторы break, которые используются для прерывания / выхода только из цикла, а не всей программы.
Что такое метод System.exit()?
Метод System.exit() вызывает метод exit в классе Runtime. Это выходит из текущей программы, завершая виртуальную машину Java. Как определяет имя метода, метод exit() никогда ничего не возвращает.
Вызов System.exit (n) фактически эквивалентен вызову:
Функция System.exit имеет код состояния, который сообщает о завершении, например:
Исключение: выдает исключение SecurityException.
Примеры
Выход: arr [0] = 1 arr [1] = 2 arr [2] = 3 Выход из цикла
Объяснение: В приведенной выше программе выполнение останавливается или выходит из цикла, как только он сталкивается с методом System.exit(). Он даже не печатает второй оператор печати, который говорит «Конец программы». Он просто завершает программу сам.
Вывод: array [0] = 1 array [1] = 2 array [2] = 3 array [3] = 4 Выход из цикла
Объяснение: В приведенной выше программе она печатает элементы до тех пор, пока условие не станет истинным. Как только условие становится ложным, оно печатает оператор и программа завершается.
Как остановить выполнение Через определенное время в Java
Изучите различные способы завершения длительного выполнения через определенное время в Java
1. Обзор
В этой статье мы узнаем, как можно завершить длительное выполнение через определенное время. Мы рассмотрим различные варианты решения этой проблемы. Кроме того, мы рассмотрим некоторые из их ловушек.
2. Использование петли
Представьте себе, что мы обрабатываем кучу элементов в цикле, например, некоторые детали элементов продукта в приложении электронной коммерции, но, возможно, нет необходимости заполнять все элементы.
На самом деле мы хотели бы обрабатывать только до определенного времени, а после этого мы хотим остановить выполнение и показать все, что список обработал до этого времени.
Давайте рассмотрим краткий пример:
Здесь петля разорвется, если время превысит предел в 30 секунд. В приведенном выше решении есть несколько примечательных моментов:
В следующем разделе мы обсудим, как подход, основанный на прерываниях, устраняет эти ограничения.
3. Использование механизма прерывания
Здесь мы будем использовать отдельный поток для выполнения длительных операций. Основной поток будет посылать сигнал прерывания рабочему потоку по таймауту.
Если рабочий поток все еще жив, он поймает сигнал и остановит его выполнение. Если рабочий завершит работу до истечения тайм-аута, это никак не повлияет на рабочий поток.
Давайте взглянем на рабочий поток:
Кроме того, мы должны проверять этот флаг на каждой итерации, чтобы убедиться, что поток прекращает выполнение самого себя в течение задержки не более одной итерации.
Далее мы рассмотрим три различных механизма передачи сигнала прерывания.
3.1. Использование таймера
Кроме того, мы можем создать TimerTask для прерывания рабочего потока по таймауту:
3.2. Использование метода Future#get
Мы также можем использовать метод get a Future вместо использования a Таймер :
3.3. Использование Услуги Планового Исполнителя
Мы также можем использовать ScheduledExecutorService для прерывания задачи. Этот класс является расширением ExecutorService и предоставляет ту же функциональность с добавлением нескольких методов, которые имеют дело с планированием выполнения. Это может выполнить заданную задачу после определенной задержки в заданные единицы времени:
Приведенная выше программа планирует выполнение задачи через одну секунду с момента подачи. Эта задача отменит исходную длительную задачу.
4. Есть ли гарантия?
Однако мы можем явно проверять наличие флага прерывания после каждого чтения в цикле. Это даст разумную гарантию остановить поток с некоторой задержкой. Но это не гарантирует остановку потока после строгого времени, потому что мы не знаем, сколько времени может занять операция чтения.
Мы можем идентифицировать методы блокировки, ища throws | InterruptedException в их сигнатурах методов.
Если какой-либо из объектов, ранее защищенных этими мониторами, находился в несогласованном состоянии, несогласованные объекты становятся видимыми для других потоков. Это может привести к произвольному поведению, которое очень трудно обнаружить и объяснить.
5. Заключение
Как остановить процесс java изящно?
Как остановить процесс Java изящно в Linux и Windows?
когда Runtime.getRuntime().addShutdownHook получить вызов, и когда это не так?
Как насчет финализаторов, они помогают здесь?
могу ли я отправить какой-то сигнал процессу Java из оболочки?
Я ищу предпочтительно портативные решения.
7 ответов
финализаторы действительно должны работать, но лучше не полагаться на это для очистки выключения, а полагаться на ваши крючки выключения, чтобы остановить вещи чисто. И, как всегда, будьте осторожны с блокировками (я видел, что слишком много крючков выключения висят весь процесс)!
вот упрощенный код:
контролируемые приложения:
запустите его с помощью следующей виртуальной машины параметры:
-протокол DCOM.солнце.управление.jmxremote
-протокол DCOM.солнце.управление.jmxremote.port=9999
-протокол DCOM.солнце.управление.jmxremote.authenticate=false
-протокол DCOM.солнце.управление.jmxremote.протокол SSL=ложь
управление приложения:
запустите его с помощью остановка или старт в качестве аргумента командной строки
другой способ: ваше приложение может открыть серверный socet и ждать, пока к нему поступит информация. Например, строка с «волшебным» словом :), а затем реагировать, чтобы сделать shutdown: System.выход.)( Вы можете отправить такую информацию socke с помощью внешнего приложения, такие как telnet.
финализаторы на Java плохие. Они добавляют много накладных расходов на сбор мусора. Избегайте их, когда это возможно.
shutdownHook будет вызываться только при выключении виртуальной машины. Я думаю, он вполне может сделать то, что вы хотите.
вот немного сложное, но портативное решение:
сигнализация в Linux может быть выполнена с помощью «kill» (Man kill для доступных сигналов), для этого вам понадобится идентификатор процесса. (ps ax / grep java) или что-то в этом роде, или сохранить идентификатор процесса при создании процесса (это используется в большинстве файлов запуска linux, см. /etc/init.d)
портативная сигнализация может быть выполнена путем интеграции SocketServer в приложение java. Это не так сложно и дает вам свободу отправлять любую команду, которую вы хотите.
Если вы означало, наконец, пункты вместо финализаторов; они не получают extecuted, когда система.вызывается exit (). Финализаторы должны работать, но не должны делать ничего более значительного, кроме печати инструкции отладки. Они опасны.
Как остановить выполнение программы Java из командной строки?
мое основное поле-.Net, но в последнее время я имею какое-то отношение к Java. Я должен создать утилиту оболочки на Java, которая могла бы работать в фоновом режиме, читая несколько записей базы данных после указанной продолжительности и выполнять дальнейшую обработку. Это своего рода планировщик. Теперь у меня мало забот:
Как сделать это работать как услуга. Я хочу выполнить его через сценарий оболочки, и утилита должна начать работать. Вне курса контроль должен вернуться к вызову скрипт.
во-вторых, в конечном итоге я могу захотеть остановить этот процесс. Как этого достичь?
Я понимаю, что это основной вопрос, но я действительно не знаю, с чего начать и какие варианты лучше для меня.
помощь / посоветуйте пожалуйста?
5 ответов
Я бы пошел на запуск программы с помощью планировщика или службы. Однако, если вы хотите использовать файл bat и сделать это программно, я изложил возможный подход ниже:
в вашей программе Java вы можете получить PID программно, а затем записать его в файл:
конечно, приложение.пид файл написано методом Java выше.
Я не уверен, как вы сможете написать сценарий, который запускает программу java, и возвращает контроль при завершении. Мне было бы интересно узнать, есть ли у кого-нибудь решение для этого.
Я предполагаю, что вы играете в свою java-программу с коробкой Linux/Unix. Чтобы запустить приложение как демон, вы можете попробовать
остановить приложение, вы можете:
Если вы хотите сделать некоторую постобработку после того, как приложение получает сигнал «убить/остановить». проверьте addShutdownHook (резьбовой крюк)