System.exit убивает Runtime.exec?

У меня есть java-программа, которая должна запускать файл bat, а затем выходить с кодом успеха 0.

Код по сути выглядит так

Runtime.exec(....);

System.exit(0);

В 99,8% случаев это работает идеально. Но очень спорадически файл bat не запускается.

Моя теория заключается в том, что в некоторых системах Runtime.exec не может завершить создание до запуска System.exit. Это вероятно/возможно?

Я просмотрел исходный код Runtime.exec, но он использует нативный код, чтобы делать интересные вещи.

ИЗМЕНИТЬ

Основываясь на ответах до сих пор, я должен заявить, что файл .bat выполняет другой процесс Java с использованием javaw. Я могу подтвердить, что окончание 1-го процесса Java НЕ убивает 2-й запуск в файле bat.

Возможно ли, что когда возникает проблема, файл bat не породил второй процесс java до того, как произошел System.exit? Возможно, это все-таки не проблема Runtime.exec?

ИЗМЕНИТЬ2

Я не могу дождаться завершения 2-го процесса, он может работать бесконечно, и мой 1-й процесс должен завершиться.


person karoberts    schedule 11.05.2012    source источник
comment
здесь нет необходимости в javaw, вместо класса Runtime будет достаточно класса Process.   -  person Harshdeep    schedule 11.05.2012


Ответы (5)


Вы создаете дочерний процесс, который завершится вместе со своим родителем. Вы должны использовать Process.waitFor в Java, чтобы убедиться, что процесс Java ожидает завершения процесса bat.

person Marko Topolnik    schedule 11.05.2012

Попробуйте перейти на ProcessBuilder. Может быть, это работает лучше.

person Gábor Lipták    schedule 11.05.2012
comment
Почему это должно работать лучше? Это просто альтернативный способ создания экземпляра Process. - person Marko Topolnik; 11.05.2012
comment
Не знаю. Возможно, это другая базовая нативная реализация. Просто идея. - person Gábor Lipták; 13.05.2012

System.exit(0) убивает экземпляр jvm. Весь процесс будет прекращен. Если вы действительно хотите выполнить System.exit(0), убедитесь, что процесс exec завершен до вызова System.exit.

person kosa    schedule 11.05.2012

Используйте Process.waitFor(), возвращаемый тип этого метода — int, что дает вам код возврата в соответствии с вашим текущим решением, использующим среду выполнения.
waitFor() заставляет текущий поток ожидать, если это необходимо, пока процесс, представленный этим объектом Process, не завершится.

person Harshdeep    schedule 11.05.2012

Измените его на

Runtime.getRuntime().exec(....).waitFor();

System.exit(0);

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

person Delta    schedule 11.05.2012