У меня есть код, который запускает процесс и асинхронно считывает из 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 потока для достижения этой асинхронной задачи "run-and-get-output" - я не знаю, почему, но я чувствую, что это не кажется правильным, используя 3 потока. Я мог бы выделить потоки из пула потоков, но это все равно будет блокировать эти потоки.
Есть ли что-нибудь, что я могу сделать, возможно, с NIO, чтобы уменьшить это до меньшего (1?) потока? Все, что я могу придумать, будет постоянно крутить нить (если я не добавлю несколько сон), чего я действительно не хочу делать...
ПРИМЕЧАНИЕ. Мне нужно читать, когда я иду (а не когда процесс остановился), и мне нужно отделить stdin от stderr, поэтому не можем перенаправлять.