流和流程的防御性副本

时间:2012-11-26 21:58:06

标签: java process reference stream defensive-copy

我正在进行Process proc运行,如果发生错误,我需要销毁并重新创建 这是因为通过stdin将命令发送到无法解析的进程的问题 我的解决方法是重置我构建的“连接”(stdin,stdout,stderr)并从新进程获取新流。当进程结束时,我正在使用线程来观看。如果发生错误,我通过quit-command关闭进程并中断线程,最终关闭流。
主线程已经建立了一个新的连接。在重建连接后发送命令时,IOException指出流已关闭 有没有办法可以复制旧流以便稍后关闭它?我已经尝试用另一台Reader包装但没有成功。我不确定它是否足以通过getXXXStream()获取进程的流并关闭它们,因为这不会关闭上面的读者。我也害怕,我可以抓住新的过程并关闭它的流 我不希望它阻止。
修改:
正如我的第一条评论所述,我立即关闭了流,但Process的问题仍然存在。如果我等待1000毫秒关闭它并用新的Process重新分配proc我的线程使用新线程(例如调用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
}

0 个答案:

没有答案