3

经过研究,我注意到使用 java 的 ProcessBuilder 的“正确”方法是生成另外两个线程来管理吞噬新创建的进程的 stdout/stderr,这样它就不会像这里所示的那样挂起: javaworld 文章

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

2.) 此外,如果您要将流重定向到两者都转到标准输出,是否可以让父进程吞下标准输出流,然后不必担心死锁?

4

1 回答 1

3

注意你的条件。线程不是进程

  1. 因为孩子可以写入两者,并且当缓冲区stderr已满时您会遇到死锁(孩子等待父母阅读stderr,父母等待孩子关闭stdout)。

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

于 2010-06-16T15:18:44.683 回答