我正在使用線程捕獲進程的流輸出,然後將該流輸出到eclipse控制檯。我的問題是何時終止正在執行流輸出的線程。使用線程捕獲進程輸出
Thread t = new Thread(new Runnable(){
private boolean isProcessDone(Process p)
{
//not sure what to do here
}
public void run()
{
Process p = Runtime.getRuntime().exec("executable with output");
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader error = new BufferedReader (new InputStreamReader(p.getErrorStream()));
while (!isProcessDone(p)) {
String line;
if((line = input.readLine()) != null)
{
System.out.println(line);
}
if((line = error.readLine()) != null)
{
System.out.println(line);
}
}
input.close();
error.close();
}
});
t.start();
我的問題屬於isProcessDone()
函數。我基於此的示例使用流的ready()
函數,但我不清楚這是否適用於std :: err和std :: out程序,但不能同時適用。我使用
try{
p.exitValue();
return true;
}catch(IllegalThreadStateException e){}
return false;
也試過,但隨後線程完成while循環有機會作用於流之前,輸出丟失。
我不想掛在主流程,而我發送這個任務;這就是爲什麼我在一個線程中這樣做。你是說我需要多個線程來處理這個任務嗎? – 2009-11-03 23:32:16
如果您嘗試消耗stoutr或stderr stout(即不是併發),那麼您可能會遇到阻塞行爲,具體取決於輸出的數量。因此,無論在新線程中產生進程,都需要在單獨的線程中使用stdout/err。 – 2009-11-03 23:34:03
感謝您對(非常)令人困惑的Java實現的很好的解釋。 – 2009-11-09 21:49:41