【发布时间】:2013-02-26 09:02:03
【问题描述】:
我使用ProcessBuilder 来运行进程。我通过在线程池 (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 而不是sb 获得结果。pw is PrintWriter pw = PrintWriter(outputStream);` 我在可运行文件中传递了它
更新 2:
似乎:status = process.waitFor(); 在处理输入流的可运行对象完成之前返回之前。怎么会这样?
我在 javadoc 中读到:the calling thread will be blocked until the subprocess exits。那么这是否意味着我可以在使用 I/O 流之前返回?
更新 3:
在Ruby
中似乎是同样的问题
IE。 进程结束和消耗输出之间存在一些竞争条件
【问题讨论】:
-
如果一个进程调用另一个进程,第一个进程可能会过早返回 - 正常行为。
-
这不是关于过早返回。而是关于在输出流被消耗之前返回
标签: java multithreading outputstream executorservice processbuilder