问题描述
在研究之后我注意到使用java的ProcessBuilder的正确方法是生成另外两个线程来管理新创建的进程的stdout / stderr,这样它就不会挂起,如下所示:
。
-
因为孩子可以写入两者并且当
stderr的缓冲区$ c $时会出现死锁c>已满(孩子等待父母阅读
stderr
,父等待孩子关闭stdout
)。
Because the child could write to both and you would get a deadlock when the buffer for
stderr
is full (child waits for parent to readstderr
, parent waits for child to closestdout
).
不。如果子进程还需要 stdin
,那么你必须在主线程中处理 stdin
并通过以下方式读取合并的输出流一个额外的线程,或者你可能再次遇到死锁(孩子等待父母读取输出流,父母等待孩子读取 stdin
上的数据)。
No. If the child process also needs stdin
, then you must handle stdin
in your main thread and read the merged output streams via an extra thread or you could have deadlocks again (child waits for parent to read the output stream and the parent waits for the child to read the data on stdin
).
这篇关于正确使用ProcessBuilder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!