Вы не ждете, пока 2 потока завершат свою работу.
Вам нужно изменить logOutput()
, чтобы вернуть объект Thread
, и вам нужно вызвать join()
в 2 возвращенных потоках сразу после вызова waitFor()
.
public void executeCommand(String command) {
...
Thread t1 = logOutput(process.getInputStream(), "");
Thread t2 = logOutput(process.getErrorStream(), "Error: ");
process.waitFor();
t1.join();
t2.join();
...
}
private Thread logOutput(InputStream inputStream, String prefix) {
Thread t = ...
t.start();
return t;
}
Кроме того, этот код является избыточным, поскольку метод log()
равен synchronized
. Снимите блок synchronized (this)
.
...
synchronized (this) {
log(prefix + scanner.nextLine());
}
...