Я использую Java ProcessBuilder для запуска подпроцесса, который является еще одной программой Java, которая должна запускаться в отдельной JVM.
Я запускаю два потока для чтения из потоков stdout и stderr из процесса, чтобы не было зависаний, если буферные буферы заполнены.
Вызов Process.waitFor возвращается, но потоки не прекращаются.
Код, который я использую, выглядит примерно так (команда представляет собой список строк):
ProcessBuilder pb = new ProcessBuilder(command);
final Process p = pb.start();
final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final ByteArrayOutputStream errStream = new ByteArrayOutputStream();
Thread outputThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getInputStream(), outStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
outputThread.start();
Thread errorThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getErrorStream(), errStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
errorThread.start();
int returncode = p.waitFor();
outputThread.join();
errorThread.join();
Если я запускаю что-то еще, например, «java -version» или «dir» или что-то еще, код работает нормально.
У меня есть доступ к коду Java, который я пытаюсь запустить, но я никогда не слышал, чтобы вы вызывали close () для System.out.