在研究之后我注意到使用java的ProcessBuilder的“正确”方法是生成另外两个线程来管理吞噬新创建的进程的stdout / stderr,以便它不会挂起,如下所示: javaworld article
但这让我想知道两个问题 - 1.)为什么需要单独的进程而不是让父进程吞噬stdout然后顺序stderr?
2。)另外,如果你要将两个流重定向到两个转到stdout只是让父进程吞下stdout流,然后不必担心死锁吗?
答案 0 :(得分:3)
注意你的条款。 Threads aren't processes
因为孩子可以写两个,当stderr
的缓冲区已满(孩子等待父母阅读stderr
时)你会遇到死锁,父母等待孩子关闭{ {1}})。
没有。如果子进程也需要stdout
,那么你必须在主线程中处理stdin
并通过额外的线程读取合并的输出流,否则你可能会再次出现死锁(子进程等待父进程读取输出流和父母等待孩子阅读stdin
)上的数据。