我正在Process proc
运行,如果发生错误,我需要销毁并重新创建它。
这是因为通过标准输入向无法解决的进程发送命令时出现问题。
我的解决方法是重置我建立的“连接”(stdin、stdout、stderr)并从新进程中获取新流。当进程结束时,我正在使用线程进行观察。如果发生错误,我会通过退出命令关闭进程并中断导致它最终关闭流的线程。
主线程已经在建立一个新的连接。在重建连接后发送命令时,IOException 状态流已关闭。
有没有办法可以复制旧流以稍后关闭它?我已经尝试过用另一个阅读器包装它,但没有成功。我不确定通过 getXXXStream() 获取进程的流并关闭它们是否足够,因为这不会关闭上面的读者。另外我担心,我可以抓住新进程并关闭它的流。
我不希望它阻止。
编辑:
正如我的第一条评论所述,我立即关闭了流,但问题Process
仍然存在。如果我要等待 1000 毫秒来关闭它并使用新的重新分配 proc,Process
我的线程将使用新的线程运行(例如调用exitValue()
)。
这是我的主题:
private class ProcEndWatcherThread extends Thread
{
private BufferedReader out, err;
private PrintWriter wr;
public ProcEndWatcherThread(BufferedReader out, BufferedReader err, `PrintWriter wr)`
{
this.out = out;
this.err = err;
this.wr = wr;
//this.out = new BufferedReader(out);
//this.err = new BufferedReader(err);
//this.wr = new PrintWriter(wr);
}
@Override
public void run()
{
boolean closed = false;
try
{
isRunning = true;
proc.waitFor();
closed = true;
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
finally
{
if(!closed)
proc.destroy();
try {
out.close();
err.close();
} catch (IOException e) {
log.throwing("ProcEndWatcherThread", "run", e);
}
wr.close();
isRunning = false;
log.info("Exitvalue: " + proc.exitValue());
}
}
}
建立我的连接的方法(连接+重新连接):
private void initCon() throws RException, IOException
{
proc = new ProcessBuilder(pathAndArgs).start();
System.out.println(proc.toString());
errRd = new BufferedReader(new InputStreamReader(
proc.getErrorStream()));
outRd = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
BufferedWriter inWr = new BufferedWriter(new
OutputStreamWriter(new BufferedOutputStream(
proc.getOutputStream())));
pWr = new PrintWriter(inWr);
procEndWatcherThread = new ProcEndWatcherThread(outRd, errRd, pWr);
procEndWatcherThread.start();
... some initializing
}