Я использую ProcessBuilder Java, чтобы запустить подпроцесс, которая является другой программой Java, которая должна работать в отдельном JVM.
Я начинаю два потока, чтобы прочитать из потоков STDOUT и STDERR из процесса, чтобы не повесить, если буферы потока заполнены. Вызов для обработки. 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, который я пытаюсь запустить, но я никогда не слышал, что вы должны назвать близко () на системе.