Я использую класс ProcessBuilder Java для запуска внешнего процесса. Процесс не должен заканчиваться до выполнения программы Java; он должен оставаться в режиме командной строки/ответа.Java ProcessBuilder: внешний процесс зависает
Я знаю, что потоки процесса могут легко «заклинивать», если пренебречь, поэтому я сделал следующее: Программа считывает объединенные потоки вывода и ошибок процесса в потоке «читателя» и использует «писатель», для управления командами. Поток читателя блокирует чтение символов из выходного процесса, буферизует их в строки и отправляет результаты. Поток писателя записывает полные «командные» строки через PrintWriter; он использует очередь, чтобы гарантировать, что никакие две команды не будут «слишком близко друг к другу» (в настоящее время 100 мс), и что никакая новая команда не будет записана до завершения предыдущей команды. Я также называю flush() и checkError() после каждого println().
Эта схема работает нормально в течение нескольких секунд или минут, затем нить считывателя зависает при блокировке read(). Никаких ошибок, исключений не было, больше нет выходных данных процесса. После этого ничто не оживит внешний процесс (не дожидаясь его перезапуска). (BTW это происходит как на Linux, так и на Windows.)
Я просмотрел код и тестовые чеки в Jakarta Commons Exec и в Plexus Utils http://plexus.codehaus.org/plexus-utils/, но (a) не дает примера использования долгоживущего процесса и (б) ни одна из них не делает ничего принципиально отличного от того, что я описал.
Кто-нибудь знает, что здесь происходит, пожалуйста? Спасибо!
я называю processBuilder.redirectErrorStream (истина); перед processBuilder.start(). Так что должен быть только один комбинированный выходной поток. – 2009-10-29 13:03:06
Вы используете отладчик? Если это так, то показывается, какие потоки принадлежат/хотят мьютексы, такие как eclipse? Похоже, это может быть тупик. – Benj
Да, я отлаживал его в Eclipse, но основное приложение работает довольно успешно - он просто ничего не может сделать полезным, пока читатель не вернет некоторые данные. – 2009-10-29 13:13:33