Xpoint
   [напомнить пароль]

Работа с Runtime, как прервать процесс

Метки: [без меток]
2006-09-15 16:22:19 [обр] Муравский Александр[досье]

Всем привет.

Уже немало времени убил на поиски, ничего подходящего не увидел. Проблема собственно не прервать процесс, а понять, что он еще не выполнился. У класса Process есть методы exitValue() и waitFor(), связанные обработкой результатов выполнения. Но ни один из них не отвечает на вопрос о том, выполняется подпроцесс или нет (waitFor() может ответить только утвердительно :)).
Каким же образом можно проверить, продолжает свою работу подпроцесс или уже закончил? Это нужно для того, чтобы минимизировать время на sleep(), потому что этот подпроцесс вызывается много раз подряд и важно, чтобы даже если он завис, вся программа не остановилась и не тормозила.

спустя 2 минуты [обр] Муравский Александр[досье]
(подписка на уведомления)
спустя 1 день 21 час [обр] 30-ый(59/584)[досье]

А чем вас не устраивает waitFor():

causes the current thread to wait, if necessary, until the process represented by this Process object has terminated. This method returns immediately if the subprocess has already terminated. If the subprocess has not yet terminated, the calling thread will be blocked until the subprocess exits.

Если не хотите, чтобы процесс повис и подвесил таким образом ваше приложение, можете либо запустить waitFor из дополнительного thread'а и убить процесс при помощи destroy(). Либо регулярно проверять exitValue():

Returns the exit value for the subprocess. IllegalThreadStateException - if the subprocess represented by this Process object has not yet terminated.

спустя 23 часа [обр] Муравский Александр[досье]

Спасибо за ответ. Решение было найдено в тот же день, использовал анонимный класс в отдельном треде, примерно как вы и сказали. Только waitFor в основном треде запустил, а в анонимном слип с последующим интерруптом основного треда.
Если кому интересно:

            final Process process = runtime.exec(cmd);
            final Thread mainThread = Thread.currentThread();
            Thread toThread = new Thread() {
                public void run() {
                    try {
                        sleep(300);
                        mainThread.interrupt();

                    } catch (InterruptedException e) {
                        
}
                }
            };
            toThread.start();

            try {
                process.waitFor();
                toThread.interrupt();
                logger.debug("Subprocess ended normally.");
            } catch (InterruptedException e) {
                throw new Exception("Subprocess execution more, than 300ms, was aborted.");
            }

А вторая мысль в голову как-то не пришла, легкие пути не для нас =).

Powered by POEM™ Engine Copyright © 2002-2005