Подождите, пока процесс завершится, прежде чем продолжить в Java

java process

33114 просмотра

4 ответа

По сути, я делаю небольшую программу, которая собирается установить некоторое программное обеспечение, а затем запускаю несколько основных команд для подготовки этой программы. Однако происходит то, что программа начинает свою установку, а затем сразу же переходит к следующим строкам (регистрация, обновления и т. Д.). Конечно, этого не произойдет, пока он не будет полностью установлен, поэтому я хотел бы найти способ ожидания первого процесса перед запуском второго. Например,

    Main.say("Installing...");
    Process p1 = Runtime.getRuntime().exec(dir + "setup.exe /SILENT");
    //Wait here, I need to finish installing first!
    Main.say("Registering...");
    Process p2 = Runtime.getRuntime().exec(installDir + "program.exe /register aaaa-bbbb-cccc");
    Main.say("Updating...");
    Process p4 = Runtime.getRuntime().exec(installDir + "program.exe /update -silent");
Автор: JTApps Источник Размещён: 12.11.2019 09:25

Ответы (4)


22 плюса

Решение

Вызов Process#waitFor(). Его Javadoc говорит:

Заставляет текущий поток ждать, если необходимо, пока процесс, представленный этим Processобъектом, не завершится.

Бонус: вы получаете выходное значение подпроцесса. Таким образом, вы можете проверить, успешно ли он завершился с кодом 0, или произошла ошибка (ненулевой код выхода).

Автор: mthmulders Размещён: 31.07.2013 01:56

5 плюса

Вы можете использовать <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#waitFor%28%29" rel="noreferrer">Process.waitFor()</a>метод

и док говорит

Заставляет текущий поток ждать , если необходимо, пока процесс, представленный этим объектом Process, не завершится. Этот метод сразу возвращается, если подпроцесс уже завершен. Если подпроцесс еще не завершен, вызывающий поток будет заблокирован до выхода из подпроцесса.

Автор: sanbhat Размещён: 31.07.2013 01:56

1 плюс

Включить waitFor () . В вашем случае ваш код будет выглядеть примерно так:

    Main.say("Installing...");
    Process p1 = Runtime.getRuntime().exec(dir + "setup.exe /SILENT");
    p1.waitFor()
    Main.say("Registering...");
    Process p2 = Runtime.getRuntime().exec(installDir + "program.exe /register aaaa-bbbb-cccc");
    Main.say("Updating...");
    Process p4 = Runtime.getRuntime().exec(installDir + "program.exe /update -silent");
Автор: NSP Размещён: 29.11.2017 08:32

0 плюса

Если вы запускаете системную команду, которая возвращает очень длинную строку ответа, буфер stdin заполняется, и процесс кажется зависшим. Это случилось со мной с sqlldr. Если это так, просто прочитайте из stdin, пока процесс запущен.

    try {
        ProcessBuilder pb = new ProcessBuilder("myCommand");
        Process p = pb.start();
        BufferedReader stdInput = new BufferedReader(new 
                InputStreamReader(p.getInputStream()));

        BufferedReader stdError = new BufferedReader(new 
                InputStreamReader(p.getErrorStream()));
        StringBuffer response = new StringBuffer();
        StringBuffer errorStr = new StringBuffer();
        boolean alreadyWaited = false;
        while (p.isAlive()) {
            try {
                if(alreadyWaited) {

                    // read the output from the command because
                    //if we don't then the buffers fill up and
                    //the command stops and doesn't return
                    String temp;

                    while ((temp = stdInput.readLine()) != null) {
                        response.append(temp);
                    }


                    String errTemp;
                    while ((errTemp = stdError.readLine()) != null) {
                        errorStr.append(errTemp);
                    }                                                   
                }
                Thread.sleep(1000);
                alreadyWaited = true;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.debug("Response is " + response);
            logger.debug("Error is: " + errorStr);
        }

    } catch (IOException e) {
        logger.error("Error running system command", e);
    }
Автор: David Nickerson Размещён: 15.07.2018 04:10
Вопросы из категории :
32x32