Обратите внимание, что каждый вызов Runtime.exec
порождает новый процесс, который выполняется параллельно.Вы уверены, что хотите порождать процессы настолько быстро, насколько это возможно?Вы, вероятно, хотите int exitValue = p.waitFor()
дождаться завершения процесса.Если вам нужен параллелизм, я бы порекомендовал планировать задачи, используя java.util.concurrent.ThreadPoolExecutor
.
Например, без особой проверки ошибок, что-то вроде этого:
final ExecutorService executor = Executors.newFixedThreadPool(2);
for (int j = 0; j < temp.length; j++) {
if(j==2) {
final String preview = temp2[i] + temp[j] +".jpg";
final String ffmpegPreviewCommand = "ffmpeg -i anotados/" +temp2[i] + " -r 1 -ss 00:00:"+temp[j]+" -t 1 -s 158x116 imagenes/" + preview;
executor.submit(new Callable() {
@Override
public Object call() throws Exception {
final Process p = Runtime.getRuntime().exec(ffmpegPreviewCommand);
final int exitValue = p.waitFor();
//TODO Check ffmpeg's exit value.
TextOut.write(preview+"\n");
}
});
}
// This waits for all scheduled tasks to be executed and terminates the executor.
executor.shutdown();
}
Посмотрите на java.util.concurrent.Executors
, чтобы выбрать исполнителя, который соответствует вашим потребностям.