Ваш подпроцесс записывает много данных? Общая проблема с использованием класса Process через Runtime.exe c или ProcessBuilder заключается в том, что вы можете заблокировать приложение Java, если не используете большие стандартные выходные потоки (или сообщения об ошибках), сгенерированные подпроцессом.
Например, попробуйте это в jshell - он не будет выполняться на моей Windows 10 машине, потому что поток STDOUT не используется (и C: \ Temp большой)
var p = Runtime.getRuntime().exec("cmd.exe /c \"dir /s C:\\Temp \"")
p.waitFor()
// DOES NOT END...
ОДНАКО: если я добавляю поток для использования большого STDOUT того же процесса, все в порядке и работает быстро:
var p = Runtime.getRuntime().exec("cmd.exe /c \"dir /s C:\\Temp \"")
var buf = new ByteArrayOutputStream(8192);
var stream = p.getInputStream();
Runnable r = () -> {
byte [] buffer = new byte[1024];
System.out.println("run() START");
try {
int len;
while ((len = stream.read(buffer)) != -1)
buf.write(buffer, 0, len);
stream.close();
}
catch (IOException ex) {
throw new UncheckedIOException(ex);
}
finally {
System.out.println("run() END");
}
}
new Thread(r).start();
p.waitFor()
System.out.println("Your process returned: "+new String(buf.toByteArray()) );
Может случиться так, что ваш cmd | cmd генерирует длинный поток, и вам нужен поток службы для использования вывод до waitFor ()