我正在從我的程序中調用一個外部JAVA進程。我消耗由衍生的過程是這樣生成的輸出:ProcessBuilder正在鎖定產生的進程
DataInputStream dis = new DataInputStream(new BufferedInputStream(myProcess.getInputStream()));
從一個線程我做了以下內容:
while (dis.available() != 0)
{
firstMesg = dis.readLine();
if(firstMesg != null)
{
// processing with the message
//System.out.println(firstMesg);
}
}
try
{
Thread.currentThread().sleep(SLEEP_TIME);
}
catch(Throwable e)
{
}
我給SLEEP_TIME 1分鐘左右,一切都工作得很好。突然對於特定的設置,我發現Sys(System.out.println)從產生的進程中花費很長時間。
任何人都可以指出我發生了什麼事?這兩個過程必須是獨立的。然而,調用者正在讀取被調用的進程。但是,在被調用的進程正在寫入的地方,緩衝區應該很大。所以沒有辦法阻止它。
我可以在Java的的ProcessBuilder DOC看到這一點:
父進程使用這些流(#getInputStream(),#getErrorStream()),以飼料投入,並從子得到的輸出。由於某些本地平臺 僅爲標準輸入和輸出流提供了有限的緩衝區大小,因此無法及時寫入輸入流或讀取子流程的輸出流可能導致子進程阻塞甚至死鎖。
外部是做什麼的?就像這裏'dis.readLine()'的線程塊一樣''你必須檢查外部進程中發生了什麼。 – Antoniossss
我正在線程上執行此操作,並不斷檢查調用的進程產生了什麼。之間有一個睡眠。 – Exploring
我在考慮外部過程 - 在調用它時調用了一個過程。總之,無論是在主應用程序中等待太久,還是阻止了外部進程,或者進程在生成輸出時都遇到了一些麻煩。總而言之,你不應該這樣等待,但是就像Brian寫的一樣,繼續閱讀流程(這個操作會盡可能地阻擋你)。獲取關於流和流操作的一些信息。 – Antoniossss