如何不阻塞地读取过程输出?

时间:2019-09-11 20:31:04

标签: java

我使用ProcessBuilder从Java启动子进程。子进程可能会永远运行,并会不时将数据写入stdout。

我想从父进程中读取此数据并做其他一些事情。

似乎我无法使用NIO选择器读取过程的inputStream,对吗?

因此,我需要使用阻塞read()在单独的线程上读取它。但是然后我无法停止该线程(直到我终止进程),因为Thread.interrupt对阻塞的线程不起作用。而且我需要以某种方式停止它,并使过程保持活动状态。

我看到的唯一解决方案是循环:

  1. 检查InputStream.available()
  2. InputStream.read()(如果实际上有可用数据)
  3. Thread.sleep()一段时间。
  4. 转到1

如果我睡得太久,我可能会丢失一些数据(由于缓冲区溢出)。而且,没有第3步,您就不需要花费CPU周期。

这里正确的解决方案是什么?

0 个答案:

没有答案