Java 如何在不阻塞的情况下读取进程输出?

Java 如何在不阻塞的情况下读取进程输出?,java,Java,我使用ProcessBuilder从Java启动子进程。子进程可能永远运行,并不时将数据写入标准输出 我想从父进程读取这些数据,并做一些其他事情 似乎我不能使用NIO选择器读取进程的inputStream,对吗 因此,我需要使用blockingread()在单独的线程上读取它。但我不能停止这个线程(直到我终止进程),因为thread.interrupt对阻塞的线程不起作用。我需要以某种方式阻止它,让这个过程保持活跃 我看到的唯一解决方案是循环: 选中InputStream.available()

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

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

似乎我不能使用NIO选择器读取进程的
inputStream
,对吗

因此,我需要使用blocking
read()
在单独的线程上读取它。但我不能停止这个线程(直到我终止进程),因为
thread.interrupt
对阻塞的线程不起作用。我需要以某种方式阻止它,让这个过程保持活跃

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

  • 选中InputStream.available()
  • InputStream.read()
    (如果实际有任何数据可用)
  • Thread.sleep()
    一段时间
  • 转到1
  • 如果我睡得太久,可能会丢失一些数据(因为缓冲区溢出)。如果没有第三步,你会白白浪费CPU周期


    正确的解决方案是什么?

    我会说让线程执行阻塞读取并终止进程以终止线程。停止线程而不停止进程的用例是什么?我希望我的应用程序在子进程运行时关闭什么?我可以使用守护进程线程吗?如果您睡眠时间过长,并且子进程试图写入的内容超过管道容量,它将挂起,直到您醒来并读取;不会丢失任何数据,但减慢子进程可能有问题,也可能没有问题。您的意思是
    打印将被阻止吗?