首页 > 解决方案 > 如何在不阻塞的情况下读取进程输出?

问题描述

我使用 Java 从 Java 启动子进程ProcessBuilder。子进程可能永远运行并不时将数据写入标准输出。

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

看来我不能使用 NIO Selector 来读取inputStream我的进程,对吗?

所以,我需要使用阻塞在单独的线程上阅读它read()。但是我不能停止这个线程(直到我杀死进程),因为Thread.interrupt它不适用于被阻塞的线程。我需要以某种方式停止它并让进程保持活力。

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

  1. 查看InputStream.available()
  2. InputStream.read()(如果有任何数据实际可用)
  3. Thread.sleep()一阵子。
  4. 去 1

如果我睡得太久,我可能会丢失一些数据(因为缓冲区溢出)。如果没有第 3 步,您就白白浪费了 CPU 周期。

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

标签: java

解决方案


推荐阅读