2017-01-02 5 views
0

В моей программе Java я запускаю внешний .jar-файл, который изменяет содержимое системного буфера обмена. После этого я продолжаю записывать данные в буфер обмена. К сожалению, похоже, что jar запускается, и программа не дожидается завершения выполнения банки.Дождитесь окончания выполнения jar-исполнения

Вот код, я использую, чтобы запустить файл банку:

import java.io.IOException; 

public class JarExecutor { 

    private String pathToJar = ""; 
    private String jarFile = ""; 
    private String pathToJava = "C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe"; 

    public JarExecutor(String pathToJar, String jarFile) { 
     this.pathToJar = pathToJar; 
     this.jarFile = jarFile; 
    } 

    public void execute() { 

     ProcessBuilder pb = new ProcessBuilder(pathToJava, "-jar", pathToJar + jarFile); 
     try { 
      Process p = pb.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

И это из основной программы:

public static void main(String[] args) { 
     String pathToJar = "\\\\some\\net\path"; 
     String jarFile = "externalProgram.jar"; 

     JarExecutor myExecutor = new JarExecutor(pathToJar, jarFile) 
     myExecutor.execute(); 

     [...] 
} 

Пока я ставлю Thread.sleep(ms) с мс> 3000 после того, как myExecutor.execute() в моей программе это работает, но я думаю, что это не правильный способ дождаться завершения другого процесса.

+0

Вы решили использовать вместо этого граду? Вы можете прекрасно выполнять внешние Java-процессы, и вы также можете разместить свой собственный код. Если это вам подходит, я могу подготовить ответ с примером и ссылками на документы. –

ответ

4

Прямо там в Process documentation:

waitFor

public abstract int waitFor() 
throws InterruptedException 

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

+0

Спасибо Работает отлично сейчас. Я добавлю свой ответ на мой вопрос – Moka

+0

@Moka: Не делайте этого, это не так, как работает SO. То, что вы сделали (обозначение ответа принято), заключается в том, как вы это делаете здесь. Рад, что помогло. –

0

Использование waitFor будет идеальным решением, если вам нужно main приступить только после выполнения баночка делается. В противном случае вы будете искать какое-то межпроцессное общение. Попробуйте использовать сокеты для передачи сообщений между процессами.

Смежные вопросы