在研究之后,我注意到使用java的ProcessBuilder的“正确”方法是生成另外两个线程来管理新创建的进程的stdout/stderr,这样它就不会挂起,如下所示:javaworld文章
但这让我想知道两个问题--一个。)为什么需要单独的进程,而不是让父进程抢占stdout,然后依次使用stderr呢?
2.)此外,如果要将流重定向到stdout,那么只让父进程吞下stdout流,而不必担心死锁是否可以接受?
发布于 2010-06-16 15:18:44
注意你的条件。线程不是进程。
stderr的缓冲区已满时,您就会遇到死锁(子等待父进程读取stderr,父等待子节点关闭stdout)。stdin,则必须在主线程中处理stdin,并通过额外的线程读取合并的输出流,否则可能再次出现死锁(子进程等待父进程读取输出流,父进程等待子进程读取stdin上的数据)。https://stackoverflow.com/questions/3054531
复制相似问题