Java ProcessBuilder的正确使用

Java ProcessBuilder的正确使用,java,processbuilder,Java,Processbuilder,经过研究,我注意到使用java的ProcessBuilder的“正确”方法是生成另外两个线程来管理新创建的进程的stdout/stderr,这样它就不会挂起,如下所示: 但这让我想知道两个问题- 1.)为什么需要单独的进程,而不是让父进程先吞掉stdout,然后依次吞掉stderr 2.)此外,如果要将流重定向到两个都转到stdout,只让父进程吞下stdout流,然后不必担心死锁,这是否可以接受?请注意您的条款 因为子级可以同时写入这两个数据,并且当stderr的缓冲区已满时,您会遇到死锁(

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

但这让我想知道两个问题- 1.)为什么需要单独的进程,而不是让父进程先吞掉stdout,然后依次吞掉stderr

2.)此外,如果要将流重定向到两个都转到stdout,只让父进程吞下stdout流,然后不必担心死锁,这是否可以接受?

请注意您的条款

  • 因为子级可以同时写入这两个数据,并且当
    stderr
    的缓冲区已满时,您会遇到死锁(子级等待父级读取
    stderr
    ,父级等待子级关闭
    stdout

  • 否。如果子进程还需要
    stdin
    ,则必须在主线程中处理
    stdin
    ,并通过额外线程读取合并的输出流,否则可能会再次出现死锁(子进程等待父进程读取输出流,父进程等待子进程读取
    stdin