我正在使用 Java 的 ProcessBuilder 类来运行外部进程。进程不应在 Java 程序终止之前终止;它必须在命令/响应模式下保持活跃。
我知道如果忽略进程流很容易“堵塞”,所以我做了以下事情:程序在“读取器”线程中读取进程的组合输出和错误流,并使用“写入器”线程来管理命令. 读取器线程从进程输出中读取阻塞字符,将它们缓冲到字符串中并分派结果。编写器线程通过 PrintWriter 编写完整的“命令”行;它使用队列来确保没有两个命令写入“靠得太近”(当前为 100 毫秒),并且在前一个命令的输出完成之前不会写入新命令。在每次 println() 之后,我也会调用 flush() 和 checkError()。
该方案可以正常工作几秒钟或几分钟,然后读取器线程挂起阻塞 read()。没有错误,没有抛出异常,没有更多的流程输出。此后,没有什么可以恢复外部进程(除了重新启动它)。(顺便说一句,这发生在 Linux 和 Windows 上。)
我已经查看了 Jakarta Commons Exec 和 Plexus Utils http://plexus.codehaus.org/plexus-utils/中的代码和测试用例,但是(a)都没有给出使用长期进程的示例和( b)似乎两者都没有做任何与我所描述的基本不同的事情。
请问有人知道这里发生了什么吗?谢谢!