【发布时间】:2015-12-23 05:30:55
【问题描述】:
我正在使用 Java 中的 ProcessBuilder 生成一个进程并尝试读取其输出:
public static void main(String... args) throws IOException, InterruptedException {
ProcessBuilder builder = new ProcessBuilder("test.exe");
Process process = builder.start();
InputStream stdout = process.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
final List<String> queue = new ArrayList<String>();
Thread ioThread = new Thread() {
public void run() {
System.out.println("STARTED THREAD");
String line = null;
try {
while ((line = reader.readLine()) != null) {
System.out.println("ADD: " + line);
queue.add(line);
Thread.yield();
}
} catch (IOException exception) {
System.err.println("Fatal Error: " + exception.getMessage());
}
}
};
ioThread.start();
Thread.sleep(10000);
System.out.println("GOT: " + queue);
}
这在我的 Windows 机器上运行良好,在本地 Linux 安装上也是如此。
在我的 Linux 虚拟机(DigitalOcean 和 Linode)上,它不起作用,但是,这意味着进程已启动,但正在运行的线程无法将单行添加到队列中(在主程序中等待十秒钟后,队列为空,而在 Windows 中,队列包含读取行)。
到目前为止我已经尝试过的想法:
- 将错误流重定向到输出流(尽管我确定测试程序在 STDOUT 上输出行
- 使用带有 -oL 和 -eL... 的 stdbuf 不起作用
- 尝试手动逐字节读取而不是使用 BufferedReader,同样的问题
- 将线程转换为 FutureTask
- 在 OpenJDK 和 Oracle VM 之间切换
它绝对适用于 Windows 和某些 Linux 机器。
【问题讨论】:
标签: java linux multithreading process output