这是我的情景:
这只发生在Windows上。我正在使用ProcessBuilder。以下是我提出的解决方案,我希望听到您的反馈,因为我不喜欢这些解决方案:
我真的很感激任何提示!
答案 0 :(得分:0)
我刚遇到同样的问题。我想我有一个问题的解决方法。在进程A中,我在Process.waitFor()之后有以下代码片段,其中outT和errT分别是读取进程B的stdout和stderr的线程:
try {
outT.join(1000);
if (outT.isAlive()) {
errmsg("stdout reader still alive, interrupting", null);
outT.interrupt();
}
} catch (Exception e) {
errmsg("Exception caught from out stream reader: "+e, e);
}
try {
errT.join(1000);
if (errT.isAlive()) {
errmsg("stderr reader still alive, interrupting", null);
errT.interrupt();
}
} catch (Exception e) {
errmsg("Exception caught from err stream reader: "+e, e);
}
p.destroy();
不确定是否需要p.destroy(),但我一直在尝试各种组合来解决问题。
无论如何,在outT / errT线程的run()方法中,我有以下内容,其中'pipe'变量是一个Writer实例,我正在捕获子进程的stdout / stderr。 'in'变量是从Process:
获得的stdout或stderr流try {
r = new BufferedReader(new InputStreamReader(in, enc));
String line;
while (true) {
if (Thread.currentThread().isInterrupted()) {
errmsg("Text stream reader interrupted", null);
break;
}
if (r.ready()) {
line = r.readLine();
if (line == null) {
break;
}
pipe.write(line);
pipe.write(SystemUtil.EOL);
if (autoFlush) {
pipe.flush();
}
}
}
pipe.flush();
} catch (Throwable t) {
errmsg("Exception caught: "+t, t);
try { pipe.flush(); } catch (Exception noop) {}
} finally {
IOUtil.closeQuietly(in);
IOUtil.closeQuietly(r);
}
似乎我从未从任何子流程获得EOF指示,即使在子流程终止之后,因此,上面的所有诡计都会阻止过时的线程和阻塞。