Как проверить, завершился ли исполняемый JAR в другой JVM - PullRequest
2 голосов
/ 27 мая 2009

ребята, я столкнулся с запутанной проблемой! Я хочу вызвать исполняемый JAR-файл для вычисления PI из моего основного приложения Java с помощью runtime.exec (), который создает новую JVM для запуска исполняемого JAR-файла. Моя проблема в том, что, когда вычисления PI сделаны, JVM все еще жива. мое основное Java-приложение не имеет представления, закончены ли вычисления PI или нет. И я также хочу, чтобы после вычисления PI JVM могла быть отключена! Как я могу это реализовать! Спасибо !!

Ответы [ 3 ]

2 голосов
/ 27 мая 2009

Когда вы вызываете Runtime.exec (), вы получаете объект Process обратно. Вам нужно позвонить waitFor () по этому вопросу.

Вам также потребуется захватить потоки stdout / stderr (в отдельных потоках, чтобы предотвратить блокировку - см. этот ответ для получения дополнительной информации).

Все это оставляет в стороне, почему вы делаете это в отдельной JVM, и почему вы не можете загрузить соответствующие классы в текущее приложение и запустить библиотеку локально.

0 голосов
/ 27 мая 2009

проверьте, что делает jar, когда вы запускаете его в автономном режиме, возможно, он ожидает ввода и поэтому никогда не выйдет

0 голосов
/ 27 мая 2009

Чтобы ответить на вторую часть вашего вопроса, JVM всегда завершается, когда не запущены потоки, не являющиеся демонами. Или, проще говоря, когда ваше приложение «выполнено» и метод main завершается, не оставляя потоков в фоновом режиме, JVM завершает работу.

Это верно независимо от того, запускаете ли вы процесс Java самостоятельно с рабочего стола / командной строки или запускаете его с помощью Runtime.exec() (что в целом эквивалентно). Поэтому, когда ваш расчет Pi завершается, он отключает JVM, который вы породили, и когда ваша исходная программа завершает работу, ее JVM также завершает работу.

Хотя я полностью согласен с Брайаном в этом, я не вижу преимущества запуска приложения Java как отдельного процесса, когда вы сможете просто запустить его в исходной JVM (за исключением некоторых действительно необычных вещей, таких как настройка). изящество или близость процессора к различным процессам).

...