Я только что столкнулся с той же проблемой.Я думаю, что у меня есть решение этой проблемы.В процессе A у меня есть следующий фрагмент кода после Process.waitFor (), где outT и errT являются потоками для чтения stdout и stderr процесса B, соответственно:
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 (), но я пробовал все виды комбинаций для решения этой проблемы.
В любом случае, в методе run () потоков outT / errT у меня есть следующее, где 'pipe'переменная - это экземпляр Writer, в который я записываю stdout / stderr подпроцесса.Переменная 'in' - это поток stdout или stderr, полученный из Process:
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 ни от какого подпроцесса, даже после того, как подпроцесс завершается, следовательно, все вышеперечисленное, чтобы предотвратить застаивание нитей и блокировку.