java - 如何在不阻塞的情况下读取进程输出?
问题描述
我使用 Java 从 Java 启动子进程ProcessBuilder
。子进程可能永远运行并不时将数据写入标准输出。
我想从父进程中读取这些数据并做一些其他的事情。
看来我不能使用 NIO Selector 来读取inputStream
我的进程,对吗?
所以,我需要使用阻塞在单独的线程上阅读它read()
。但是我不能停止这个线程(直到我杀死进程),因为Thread.interrupt
它不适用于被阻塞的线程。我需要以某种方式停止它并让进程保持活力。
我看到的唯一解决方案是循环:
- 查看
InputStream.available()
InputStream.read()
(如果有任何数据实际可用)Thread.sleep()
一阵子。- 去 1
如果我睡得太久,我可能会丢失一些数据(因为缓冲区溢出)。如果没有第 3 步,您就白白浪费了 CPU 周期。
这里的正确解决方案是什么?
解决方案
推荐阅读
- javascript - 如何在 asp.net core mvc 中验证 JavaScript 创建的元素
- asp.net-core-mvc - 如何在 ASP.NET Core 3.1 中扩展 Authorize 属性的逻辑?
- python - 在 Python 中创建嵌套字典
- python - 获取 GAN 创建的图像标签
- c# - Xamarin CollectionView 空白
- apache - 通过 Certbot 在 Debian 上使用 SSL 的 Apache:如何为特定子文件夹添加配置设置?
- python-3.x - 如何在 Python 中打开系统日志文件
- c# - 如何将角色旋转到相机的旋转?
- flutter - Flutter:如何通过 dart Code 获取我的 Flutter 应用程序中所有小部件对象的所有属性以在测试中使用它?
- r - R在读/写CSV时失去小数点的精度?