我有一些代码可以异步执行一个进程并从stdout和stderr读取信息,然后在进程完成时进行处理。它看起来像这样:
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分开,因此无法使用重定向。
runAsync(String command)
的方法内部,我需要立即返回(它是异步的)。我该如何处理进程的退出代码以及流的读取完成,而不需要额外的线程? - Cheetah