我使用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