我使用ProcessBuilder
來運行進程。我通過提交在線程池中處理它們的相應runnable來處理輸入/輸出流(Executors.newCachedThreadPool()
)。
我得到的結果,但時不時我什麼都沒有。
例如,如果我這樣做:cmd \C dir
到進程生成器我得到dir
的結果回來,但有時我什麼也沒有得到(儘管結果似乎從處理process.getInputStream
的runnable回來)。
我該如何調試?它顯示了intermitently。 使用相同的代碼我沒有任何問題,當我做new Thread(runnable).start()
。在我切換到線程池後開始發生。等待進程和讀取流之間的併發問題?
更新:
我想我找到的東西:
我中Runnable
如下:
try {
while ((line = br.readLine()) != null) {
pw.println(line);
sb.append(line);
}
System.out.println("Finished reading "+sb.length());
} catch (IOException e) {
e.printStackTrace();
}
finally{
pw.flush();
try{
isr.close();
}catch(Exception e){}
}
在不工作,它打印Finished reading 521
的案件。但我試圖通過pw
而不是sb
得到結果。
pw
是PrintWriter的PW = PrintWriter的(OutputStream中);`其中我通過在可運行
更新2:
似乎:status = process.waitFor();
返回較早該處理InputStream的結束該可運行之前。這怎麼會發生?我讀過javadoc:
the calling thread will be blocked until the subprocess exits
。那麼這是否意味着我可以在之前返回消耗I/O流?
更新3:
似乎是這裏同樣的問題在Ruby
即過程結束和消耗輸出之間存在一些競爭條件
如果進程調用另一個進程,第一個進程可能會過早返回 - 正常行爲。 – Sebastian 2013-03-11 10:21:35
這不是關於過早返回。它是關於在輸出流消耗之前返回* – Jim 2013-03-11 10:45:46