我的代码中存在问题
ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
Process core = pb.start();
if(!core.waitFor(5, TimeUnit.HOURS))
{
isDestroyed = true;
core.destroy();
}
else
isDestroyed = false;
String xmlOutput = IOUtils.toString(core.getInputStream());
问题是它一直工作5个小时,但是当我从控制台运行它时,它的工作时间<10秒。有什么问题?操作系统是Windows 8.1 64位。
我希望它与从控制台同时运行。或者还有另一种获得输出的好方法?如果是,请说明如何。感谢
答案 0 :(得分:0)
你等了5个小时,等待进程退出,等待你消耗一些输入,所以它不会被阻止生成它以便它可以退出。
您应首先使用输入,然后执行waitFor().
注意您还需要关闭流程的输出流,以便它不会等待输入。
答案 1 :(得分:0)
您可以让您的流程返回其正在处理的输出while
:
ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
Process core = pb.start();
InputStream stream = core.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line;
StringBuilder stringBuilder = new StringBuilder();
long end = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(5);
while (System.currentTimeMillis() < end && (line = reader.readLine()) != null) {
stringBuilder.append(line);
}
stream.close();
String xmlOutput = stringBuilder.toString();
答案 2 :(得分:0)
在另一个线程中使用进程的STDOUT。主线程等待进程终止。
ProcessBuilder pb = new ProcessBuilder("my program.exe","-g");
Process core = pb.start();
InputStream stream = core.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder stringBuilder = new StringBuilder();
new Thread(() -> {
try {
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException ex) {
}
}).start();;
if(!core.waitFor(5, TimeUnit.HOURS)) {
isDestroyed = true;
core.destroy();
} else
isDestroyed = false;