我使用 aProcessBuilder
来运行进程。Executors.newCachedThreadPool()
我通过在线程池 ( )中提交相应的可运行对象来处理输入/输出流。
我得到了结果,但时不时地我什么也得不到。
例如,如果我这样做:cmd \C dir
对于流程构建器,我得到了dir
返回的结果,但有时我什么也没得到(尽管结果似乎从处理process.getInputStream
.
我该如何调试呢?它间歇性地出现。使用相同的代码时,我没有任何问题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
and not得到结果sb
。
pw
是 PrintWriter pw = PrintWriter(outputStream);` 我在 runnable 中传递的
更新 2:
似乎:在处理输入流的可运行对象完成之前status = process.waitFor();
返回。这怎么可能发生?
我在 javadoc 中阅读:. 那么这是否意味着我可以在使用 I/O 流 之前返回?
the calling thread will be blocked until the subprocess exits
更新 3:在Ruby
中似乎是同样的问题,
即在进程结束和消耗输出之间存在一些竞争条件