Вот что у меня есть: У меня есть поток, который запускает процесс, этот процесс создается ProcessBuilder и запускает строчную команду в терминале. Существует много параллельных потоков, которые делают то же самое, но на разных данных.В java, как сделать ничью, чтобы ждать завершения процесса?
Вот что я хочу сделать: Я хочу создать ничью (которая начала процесс), чтобы дождаться этого процесса, пока он не закончится. Я придумал два метода, и никто не работает.
способ 1: использовать process.waitFor(); и это приводит к тому, что все параллельные потоки ждут завершения одного процесса (обычно первого). Описание waitFor(); говорит, что он заставляет один поток ждать, но это не то, что он делает, он фактически заставляет ВСЕ потоки ждать. Следовательно, программа больше не параллельна.
метод 2: для запуска другого потока, который считывает потоковый поток из этого процесса, ждет, пока не будет поток, а затем запустит функцию, которая должна была запускаться после этого процесса. Недостатком является то, что сейчас есть много потоков, поэтому я предпочитаю не использовать этот метод. Другая проблема с этим методом заключается в том, что я запутался в том, какой из этих свойств процесса я должен использовать? OutputStream, InputStream или ErrorStream?
Вот код:
public class Thread1 extends Thread{
private String[] incommand; //this is the command for the process builder
private String newoutputfile;
InputStream ins = null;
Reader r = null;
BufferedReader br = null;
ProcessBuilder pbtx = null;
public Thread1(String[] incommand, String newoutputfile){
super("Thread1");
this.incommand = incommand;
this.newoutputfile = newoutputfile;
this.pbtx = new ProcessBuilder();
}
@Override
public void run(){
try{
pbtx.command(incommand);
Process ptx = pbtx.start();
//to make sure job is done
ptx.waitFor(); //problem is apparently here
// made sure job is done
//the next function is supposed to run after the process is finished
rite();
//
} catch (IOException ex){
System.out.println("exception in thread t1");
ex.printStackTrace();
}
catch (InterruptedException yo){
System.out.println("exception in thread t1");
}
}
Кстати, этот процесс представляет собой процесс FFmpeg, каждый процесс работает на разных видеоданных (без зависимостей данных или состояния гонки или то, что так когда-либо здесь). Все эти потоки thread1 создаются и запускаются другим основным потоком в другой функции (основной). Операционная система в Linux. IDE - Netbeans (вот где я получаю описание каждой функции). Я попытался сохранить скопированный код как можно короче (для простоты), поэтому, если вы считаете, что код для других функций или остальной программы необходим, пожалуйста, сообщите мне, чтобы они вставляли их здесь.
Большое спасибо,
Как вы начинаете? Я серьезно сомневаюсь, что Process.waitFor() замораживает все потоки. – Kayaman
Поговорите с вами для ответа. Потоки запускаются threadobject.start(), а затем threadobject.join() в основной программе. Не использовать .join() приведет к тому, что потоки будут проходить по их входным переменным. – user2452253
Ну, использование '.join()' приведет к тому, что потоки будут ждать. 'Process.waitFor()' не имеет к этому никакого отношения. – Kayaman