正确使用ProcessBuilder

时间:2010-06-16 15:04:04

标签: java processbuilder

在研究之后我注意到使用java的ProcessBuilder的“正确”方法是生成另外两个线程来管理吞噬新创建的进程的stdout / stderr,以便它不会挂起,如下所示: javaworld article

但这让我想知道两个问题 - 1.)为什么需要单独的进程而不是让父进程吞噬stdout然后顺序stderr?

2。)另外,如果你要将两个流重定向到两个转到stdout只是让父进程吞下stdout流,然后不必担心死锁吗?

1 个答案:

答案 0 :(得分:3)

注意你的条款。 Threads aren't processes

  1. 因为孩子可以写两个,当stderr的缓冲区已满(孩子等待父母阅读stderr时)你会遇到死锁,父母等待孩子关闭{ {1}})。

  2. 没有。如果子进程也需要stdout,那么你必须在主线程中处理stdin并通过额外的线程读取合并的输出流,否则你可能会再次出现死锁(子进程等待父进程读取输出流和父母等待孩子阅读stdin)上的数据。