簡體   English   中英

為什么java的inputstream.close()會阻塞?

[英]why does java's inputstream.close() block?

我的Java程序使用ProcessBuilder(redirectErrorStream設置為true)並且有一個循環來運行進程的inputstream的read方法,該方法是阻塞的。 我正在調用的外部程序停止等待輸入和stdin。 我現在想殺死這個過程。 這是不是由(在一個單獨的線程中)調用進程的destroy方法,並調用inputstream的close方法來阻止read方法阻塞,以便我的初始線程可以結束它的生命?

由於某種原因, process.getInputStream().close()阻止。 從JavaDoc我不明白為什么會發生這種情況。 此外,我不明白為什么javadoc說“InputStream的close方法什么都不做”。 鏈接到javadoc )有人可以解釋一下嗎?

謝謝 :-)

關於阻塞行為,Java中存在一個已知問題,當與另一個進程通信時會導致死鎖。 我不知道這是否是你所看到的,但值得研究。 java.lang.Process的文檔說:

由於某些本機平台僅為標准輸入和輸出流提供有限的緩沖區大小,因此無法及時寫入輸入流或讀取子進程的輸出流可能導致子進程阻塞甚至死鎖。

由於某種原因,process.getInputStream()。close()阻止。 從JavaDoc我不明白為什么會發生這種情況。 此外,我不明白為什么javadoc說“InputStream的close方法什么都不做”。 (鏈接到javadoc)有人可以解釋一下嗎?

如果你看一下Javadoc,你會發現InputStream是一個抽象類。 擴展InputStream的子類應該覆蓋close()方法(如果需要)。 顯然,您正在使用的InputStream子類在close方法中執行了某些操作。

添加到jdigital寫的內容,請查看此文章 它處理Runtime.exec()方法,並且在Java 5中引入了ProcessBuilder ,但在我看來,討論可以推廣到系統進程。

我想我想出來了。 顯然,在process.getInputStream()。close()和process.getErrorStream()。close()之前調用process.getOutputStream()。close()是很重要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM