почему java's inputtream.close () блокирует? - PullRequest
6 голосов
/ 15 марта 2009

Моя Java-программа использует ProcessBuilder (с redirectErrorStream установлено значение true) и имеет цикл, который запускает метод read входного потока процессов, который блокирует. Затем внешняя программа, которую я вызываю, останавливается, ожидая ввода и ввода. Теперь я хочу убить процесс. Разве это не выполняется (в отдельном потоке) вызовом метода уничтожения процесса и вызовом метода close входного потока, чтобы остановить блокировку метода чтения, чтобы мой исходный поток мог завершить свою жизнь?

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

Спасибо: -)

Ответы [ 4 ]

4 голосов
/ 15 марта 2009

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

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

3 голосов
/ 15 марта 2009

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

3 голосов
/ 15 марта 2009

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

3 голосов
/ 15 марта 2009

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

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

...