почему делает inputstream.close Java () блок?

Моя программа Java использует ProcessBuilder (с верным набором redirectErrorStream) и имеет цикл, который выполняет метод чтения inputstream процессов, который блокируется. Внешняя программа, которую я называю затем, прибывает в остановку, ожидающую входа и stdin. Я теперь хочу уничтожить процесс. Разве это не сделано (в отдельном потоке), вызов процесса уничтожает метод и вызов близкого метода inputstream, чтобы мешать методу чтения больше блокироваться, так, чтобы мой начальный поток мог закончить свою жизнь?

По некоторым причинам process.getInputStream().close() блоки. От JavaDoc я не вижу, почему это может произойти. Кроме того, я не понимаю, почему javadoc говорит, что "Близкий метод InputStream ничего не делает". (свяжитесь с javadoc), кто-то мог объяснить это?

Спасибо :-)

6
задан Allanrbo 13 August 2012 в 12:11
поделиться

4 ответа

Относительно блокирующегося поведения существует известная проблема в Java, который может вызвать мертвую блокировку при общении с другим процессом. Я не могу сказать, является ли это тем, что Вы видите, но это стоит изучить. Документ для java.lang. Процесс говорит:

Поскольку некоторые собственные платформы только обеспечивают ограниченный размер буфера для стандартных входных и выходных потоков, отказ быстро записать, что входной поток или считать поток вывода подпроцесса может заставить подпроцесс блокироваться, и даже заходить в тупик.

4
ответ дан 8 December 2019 в 18:41
поделиться

По некоторым причинам process.getInputStream () .close () блоки. От JavaDoc я не вижу, почему это может произойти. Кроме того, я не понимаю, почему javadoc говорит, что "Близкий метод InputStream ничего не делает". (свяжитесь с javadoc), кто-то мог объяснить это?

При рассмотрении Javadoc Вы будете видеть тот InputStream абстрактный класс. Подклассы, которые расширяют InputStream, как ожидают, переопределят завершение (), метод (должен это быть необходимым). Очевидно подкласс InputStream, который Вы используете, делает что-то в близком методе.

3
ответ дан 8 December 2019 в 18:41
поделиться

Я думаю, что понял это. Очевидно, важно назвать process.getOutputStream () .close () прежде process.getInputStream () .close () и process.getErrorStream () .close ().

3
ответ дан 8 December 2019 в 18:41
поделиться

При добавлении на то, что записал jdigital, проверьте эту статью. Это имеет дело с Runtime.exec() метод, и ProcessBuilder был представлен в Java 5, но это кажется мне, обсуждение может экстраполироваться к системным процессам в целом.

3
ответ дан 8 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: