2009-10-14 2 views
0

У меня есть Java-программа, которая выполняет определенные команды в ОС. Я также использую Process.waitfor(), как показано в приведенном ниже коде, чтобы указать, завершилось ли выполнение успешно или не удалось.Выполнение Java команд в операционной системе

Мой вопрос в том, есть ли другой способ избежать использования process.waitfor(), есть ли способ использовать цикл while и выполнять определенное действие до тех пор, пока процесс не будет завершен?

  Runtime rt = Runtime.getRuntime(); 

     Process p = rt.exec(cmdFull); 

     BufferedReader inStream = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String inStreamLine = null; 
     String inStreamLinebyLine=null; 
     while((inStreamLine = inStream.readLine()) == null) { 
      inStreamLinebyLine = inStreamLinebyLine+"\n"+inStreamLine; 
     } 


     try { 
      rc = p.waitFor(); 

     } catch (InterruptedException intexc) { 
      System.out.println("Interrupted Exception on waitFor: " + 
           intexc.getMessage()); 
     }  

WAHT Я хотел бы сделать, это что-то вроде этого

  Runtime rt = Runtime.getRuntime(); 

     Process p = rt.exec(cmdFull); 

     BufferedReader inStream = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String inStreamLine = null; 
     String inStreamLinebyLine=null; 
     while((inStreamLine = inStream.readLine()) == null) { 
      inStreamLinebyLine = inStreamLinebyLine+"\n"+inStreamLine; 
     } 


     try { 

      while ((rc = p.waitFor()) == true) { // This is made up, I don't even think it would work 
       System.out.println('Process is going on...'); 
      } 


     } catch (InterruptedException intexc) { 
      System.out.println("Interrupted Exception on waitFor: " + 
           intexc.getMessage()); 
     }  

Спасибо,

ответ

1

Возможно, что-то подобное будет работать. Создайте Thread, как предлагается @tschaible, затем выполните соединение в этом потоке с таймаутом (который является частью, которую вы составили в своем коде). Это будет выглядеть примерно так:

Thread t = new Thread(new Runnable() { 

    public void run() { 
    // stuff your code here 
    } 

}); 
t.run(); 

while (t.isAlive()) { 
    t.join(1000); // wait for one second 
    System.out.println("still waiting"); 
} 

Что это делает запуск кода в отдельном потоке, а затем проверить, если протектор закончил каждую секунду. Цикл while должен заканчиваться, когда поток заканчивается и больше не жив. Возможно, вам придется проверить InterruptedException, но я не могу проверить это сейчас.

Надеюсь, что это отправит вас в правильном направлении.

1

Вы могли бы породить новую нить перед началом процесса.

Новый поток будет отвечать за распечатку «Процесс продолжается ...» или что-то еще необходимо.

После завершения p.waitFor() основной поток, который запустил процесс, указывает на новый поток, который он должен прекратить.

1

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

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