У меня очень распространенное состояние зависания потока, хотя я не понимаю, почему это происходит.У меня есть 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
спасибо