Защитная копия потоков и процесса

У меня Process proc запуск которого мне нужно уничтожить и воссоздать в случае ошибки.
Это связано с проблемой отправки команд через stdin процессу, которую он не может устранить.
Мой обходной путь - сбросить построенное мной "соединение" (stdin, stdout, stderr) и получить новые потоки из нового процесса. Я использую поток, чтобы посмотреть, когда процесс заканчивается. Если возникает ошибка, я прекращаю процесс с помощью команды quit и прерываю поток, что приводит к окончательному закрытию потоков.
Основной поток уже создает новое соединение. При отправке команды после восстановления соединения 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
}

0 ответов

Другие вопросы по тегам