Подпроцесс, начавшийся с Java Finishes, используя Waitfor, но потоки не прекращаются

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

6
задан David Göransson 19 September 2011 в 14:51
поделиться