【发布时间】:2014-08-01 18:08:30
【问题描述】:
我有一些代码运行一个进程并异步读取标准输出和标准错误,然后在进程完成时处理。它看起来像这样:
Process process = builder.start();
Thread outThread = new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
// Read stream here
} catch (Exception e) {
}
});
Thread errThread = new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
// Read stream here
} catch (Exception e) {
}
});
outThread.start();
errThread.start();
new Thread(() -> {
int exitCode = -1;
try {
exitCode = process.waitFor();
outThread.join();
errThread.join();
} catch (Exception e) {
}
// Process completed and read all stdout and stderr here
}).start();
我的问题是我使用 3 个线程来实现这个异步“运行并获取输出”任务 - 我不知道为什么,但我觉得使用 3 个线程感觉不对。我可以从线程池中分配线程,但这仍然会阻塞这些线程。
有什么我可以做的,也许是使用 NIO 来减少这个(1?)线程?我能想到的任何事情都会不断地旋转线程(除非我添加了一些睡眠),我也不想这样做......
注意:我确实需要边读边读(而不是在进程停止时),并且我确实需要将 stdin 与 stderr 分开,因此无法进行重定向。
【问题讨论】:
-
我认为您不需要最后一个线程。除非您需要循环运行其中的多个。
-
@ElliottFrisch - 您在一个名为
runAsync(String command)的方法中看到的内容我需要立即返回(它是异步的)。我将如何处理进程的退出代码以及在没有额外线程的情况下完成流的读取? -
鉴于此,我认为您需要所有三个线程。
标签: java multithreading