Запускаю процесс через exec. Как подождать, пока он выполнится?

Запускаю разархивирование.

Process proc1 = Runtime.getRuntime().exec("cmd /c d:/time/pak/rar.exe x d:/time/pak/folder.rar d:/time/1");

Архивирование длится около минуты. После него нужно выполнять определенные действия. Что можно делать, чтобы программа дальше не выполнялась, пока выполняется процесс.

Thread.sleep() не помогает. Этот метод останавливает и архивирование тоже. Process ping = Runtime.getRuntime().exec("ping -n 60 localhost"); тоже самое, останавливает извлечение архива.

proc1.waitFor(); не работает

Если написать

rocess proc1 = Runtime.getRuntime().exec("cmd /c start /wait d:/time/pak/rar.exe x d:/time/pak/folder.rar d:/time/1");

то proc1.waitFor(); работает, но появляется консоль.


Ответы (1 шт):

Автор решения: Ramiz

Process.waitFor ждёт завершения запущенного процесса. Он работает и возвращается как только запущенный процесс завершается. Дело в том что Вы запускаете два процесса - cmd и rar, причем cmd запускает rar и завершается (вариант без /wait). Судя по комментариям Вас не совсем устраивает факт появления консоли от cmd. Тогда возникает вопрос, а зачем вообще запускать cmd? Почему бы не запускать сразу rar?

Process proc1 = Runtime.getRuntime().exec("d:/time/pak/rar.exe x d:/time/pak/folder.rar d:/time/1");

если все же cmd и start нужны, то start может запускать без консоли с опцией /b см: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/start

еще можно попробовать запускать через start но без cmd

→ Ссылка