Runtime.exec ().waitFor ()на самом деле не ожидает

У меня есть код, который использует 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.sleeps в течение 10 секунд, как простой тест, и, как и ожидалось, A возвращается только через 10 секунд после запуска.

Я полагаю, что это, вероятно, какая-то проблема с потоками с external.jar, когда выполнение передается от одной вещи к другой, но, учитывая, что она работает непосредственно из командной строки, я ожидал увидеть такое же поведение (, возможно наивно )при вызове из другой Java-программы.

Я тестировал это на Windows и Ubuntu с Java 6.

Спасибо!

12
задан Rhys 5 July 2012 в 18:28
поделиться