Java: Runtime.exec () поток и ошибка выходной, readLine - PullRequest
2 голосов
/ 04 сентября 2011

У меня очень распространенное состояние зависания потока, хотя я не понимаю, почему это происходит.У меня есть 2 потока: main () и errorStreamReaderThread

В основном потоке:
- выполнить внешний процесс через Runtime.exec ()
- создать новую errorStreamReaderThread для использования ошибкивыходной поток
- выполнение манипуляций с входным и выходным потоками внешнего процесса (выполнение команд и чтение выходных данных команд)
- отправка команды выхода внешнему процессу
- установка флага прерывания для errorStreamReaderThread
- ожидание() для завершения внешнего процесса
- вернуть rc внешнего процесса

В errorStreamReaderThread:
- выполнить буферизованную строку чтения в потоке ошибок, пока! interruptedFlag &&(line = br.readLine ())! = null (errorStream передается из внешнего процесса из main)
- выполнить поток ошибок журнала


Я ожидаю, что даже если readLine ()блок в потоке - как только создатель этого потока будет завершен (в данном случае это внешний процесс), этот readLine должен быть прерван.

Наблюдаемое поведение - все работает нормально в 95% случаев - никаких зависаний, оба потока: основной и ошибочный потоки завершены, а программа завершена.- около 5% зависает - основной поток завершен (возвращается waitFor) - errorStreamReaderThread заблокирован на BufferedReader.readLine (фактически поток ошибок для этого буферизованного читателя больше не существует, поскольку внешний процесс завершен)

Дополнительный фактор среды заключается в том, что этот java-класс выполняется как java-функция oracle (она заключена в oracle)

Пожалуйста, дайте мне знать, что мне здесь не хватает и почему я получил этот readLine зависает на несуществующемerrorStream

спасибо

1 Ответ

0 голосов
/ 04 сентября 2011

на самом деле поток ошибок для этого буферизованного считывателя больше не существует, поскольку внешний процесс завершен

Как вы думаете, это так, потому что вы отправили команду выхода ввнешний процесс, или вы действительно проверили оба случая?

Поскольку BufferedReader.readLine () больше не будет блокировать, а будет возвращать ноль после закрытия сокета, я не думаю, что сокет закрылся ...

...