我使用ProcessBuilder
从Java启动子进程。子进程可能会永远运行,并会不时将数据写入stdout。
我想从父进程中读取此数据并做其他一些事情。
似乎我无法使用NIO选择器读取过程的inputStream
,对吗?
因此,我需要使用阻塞read()
在单独的线程上读取它。但是然后我无法停止该线程(直到我终止进程),因为Thread.interrupt
对阻塞的线程不起作用。而且我需要以某种方式停止它,并使过程保持活动状态。
我看到的唯一解决方案是循环:
InputStream.available()
InputStream.read()
(如果实际上有可用数据)Thread.sleep()
一段时间。如果我睡得太久,我可能会丢失一些数据(由于缓冲区溢出)。而且,没有第3步,您就不需要花费CPU周期。
这里正确的解决方案是什么?