У меня есть код, который использует Runtime.exec ()для запуска внешнего.jar (, созданного как установщик IzPack ).
Если я запущу этот external.jar из командной строки вот так:
java -jar external.jar
Затем командная строка не возвращает управление, пока приложение не будет завершено. Однако, если я запускаю external.jar из некоторого класса Java, используя:
Process p = Runtime.getRuntime().exec("java -jar external.jar");
int exitCode = p.waitFor();
System.out.println("Process p returned: " + exitCode);
Затем p
возвращается почти мгновенно с кодом успеха 0
, несмотря на то, что external.jar еще не завершил выполнение (. Я также пробовал это через ProcessBuilder
маршрут выполнения внешнего файла ).
Почему он ждет возврата из командной строки, а не при выполнении из другой Java-программы?
Я также установил 3 банки, A, B и C, где A вызывает B, который вызывает C (, используяRuntime.exec()
), где C Thread.sleep
s в течение 10 секунд, как простой тест, и, как и ожидалось, A возвращается только через 10 секунд после запуска.
Я полагаю, что это, вероятно, какая-то проблема с потоками с external.jar, когда выполнение передается от одной вещи к другой, но, учитывая, что она работает непосредственно из командной строки, я ожидал увидеть такое же поведение (, возможно наивно )при вызове из другой Java-программы.
Я тестировал это на Windows и Ubuntu с Java 6.
Спасибо!