2010-06-16 2 views
3

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

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

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

ответ

3

Учтите свои условия. Threads aren't processes.

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

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

Смежные вопросы