Запустите процесс асинхронно и прочитайте данные из stdout и stderr.JAVA

Программисты JAVA общаются здесь
Anonymous
Запустите процесс асинхронно и прочитайте данные из stdout и stderr.

Сообщение Anonymous »

У меня есть код, который запускает процесс и асинхронно считывает данные из 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?) ниток? Все, о чем я могу думать, будет постоянно вращаться (если я не добавлю несколько снов), чего мне тоже не очень хочется делать...

ПРИМЕЧАНИЕ. Мне нужно читать по ходу дела (а не когда процесс остановлен), и мне нужно отделить стандартный ввод от стандартного ввода, чтобы не было возможности выполнить перенаправление.

Подробнее здесь: https://stackoverflow.com/questions/250 ... and-stderr

Вернуться в «JAVA»