Правильное использование ProcessBuilder - PullRequest
3 голосов
/ 16 июня 2010

После исследования я заметил, что «правильный» способ использования Java ProcessBuilder - это создание двух других потоков для управления поглощением stdout / stderr недавно созданного процесса, чтобы он не зависал, как показано здесь: Статья javaworld

Но это заставило меня задуматься о двух вопросах: 1.) Почему именно отдельные процессы необходимы вместо того, чтобы родительский процесс поглощал стандартный вывод, а затем последовательно - стандартный вывод?

2.) Кроме того, если бы вы перенаправили потоки на оба пути, переходили на стандартный вывод, было бы приемлемо, чтобы родительский процесс проглотил поток стандартного вывода, а затем не беспокоился о взаимоблокировках?

1 Ответ

3 голосов
/ 16 июня 2010

Следите за вашими условиями. Потоки не являются процессами .

  1. Поскольку дочерний элемент может писать в оба, и вы получите тупик, когда буфер для stderr заполнен (дочерний элемент ожидает, пока родительский файл прочитает stderr, родительский элемент ожидает дочернего элемента, чтобы закрыть stdout).

  2. Нет. Если дочернему процессу также требуется stdin, то вы должны обработать stdin в своем основном потоке и прочитать объединенные выходные потоки через дополнительный поток, или у вас могут снова возникнуть взаимоблокировки (дочерний процесс ожидает, когда родительский файл прочитает выходной поток и родительский поток ждет, пока ребенок прочитает данные по stdin).

...