2014-09-04 2 views
3

Как заставить мой родительский процесс java ждать завершения дочернего процесса. Я попытался с runtime.exec и processBuilder.pb:Реальный процесс не завершится и не завершится в Windows?

String cmd = "ffmpeg -i input.vob output.mp4" 
Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec(cmd); 
proc.waitFor(); 

Это прекрасно работает с небольшим входным файлом (скажем, менее 10 Мб). Если я дам больший входной файл, тогда программа будет повешена. Выходной файл будет частично создан, и создание файла будет изменено, и управление не вернется. Даже proc.join(10000); не дал никакого полезного результата. Здесь родительский процесс заканчивается до завершения дочернего процесса (ffmpeg).

Как преодолеть эту проблему?

+0

чтения и реализации * все * рекомендации [Когда Runtime.exec() не будет] (http://www.javaworld.com/article/2071275/ ядро-Java/когда-среда-Exec --- выиграл-t.html). Затем проигнорируйте это, ссылаясь на 'exec (..)' и используйте 'ProcessBuilder' для создания' Process'. Также разбить 'String args' на' String [] args' для учета аргументов, содержащих пробелы. –

ответ

3

Вам необходимо прочитать данные, выводимые процессом.

Процесс имеет 2 выходных потока: стандартный выход и выход ошибки. Вы должны прочитать оба, потому что процесс может записываться на оба этих выхода.

Выходные потоки процесса имеют буферы. Если буфер выходного потока заполнен, попытка записи дополнительных данных в этот процесс блокируется.

ли что-то вроде этого:

InputStream in = proc.getInputStream(); // To read process standard output 
InputStream err = proc.getErrorStream(); // To read process error output 

while (proc.isAlive()) { 
    while (in.available() > 0) 
     in.read(); // You might wanna echo it to your console to see progress 

    while (err.available() > 0) 
     err.read(); // You might wanna echo it to your console to see progress 

    Thread.sleep(1); 
} 
Смежные вопросы