Я пытаюсь запустить процесс и делать материал с его потоками ввода, вывода и ошибок. Очевидный способ сделать это - использовать что-то вроде select()
, но единственное, что я могу найти в Java, это Selector.select()
, которое принимает Channel
. Это не представляется возможным получить Channel
от InputStream
или OutputStream
(FileStream
имеет метод getChannel()
, но это не помогает здесь)Как обрабатывать несколько потоков в Java?
Итак, вместо этого я написал код, чтобы опрашивать все потоки:
while(!out_eof || !err_eof)
{
while(out_str.available())
{
if((bytes = out_str.read(buf)) != -1)
{
// Do something with output stream
}
else
out_eof = true;
}
while(err_str.available())
{
if((bytes = err_str.read(buf)) != -1)
{
// Do something with error stream
}
else
err_eof = true;
}
sleep(100);
}
который работает, за исключением того, что он никогда не заканчивается. Когда один из потоков достигает конца файла, available()
возвращает ноль, поэтому read()
не вызывается, и мы никогда не получаем возврат -1, который указывает на EOF.
Одним из решений является неблокирующий способ обнаружения EOF. Я не вижу его нигде в документах. Или есть лучший способ сделать то, что я хочу сделать?
Я вижу этот вопрос здесь: link text и, хотя это не совсем то, что я хочу, я, вероятно, могу использовать эту идею, нерестовые отдельные потоки для каждого потока, для конкретной проблемы, у меня сейчас. Но, конечно, это не единственный способ сделать это? Разумеется, должен быть способ чтения из нескольких потоков без использования потока для каждого?