2015-04-20 22 views
6

Uruchamiam plik .exe z języka Java, używając klasy ProcessBuilder i klasy Process. Aby wyjaśnić, co robię:ProcessBuilder i Process.waitFor(), jak długo trwa oczekiwanie?

   builder = new ProcessBuilder(commands); 
      builder.redirectErrorStream(true); 
      Process process = builder.start(); 
      process.waitFor(); 

Chciałem tylko wiedzieć, na jak długo czeka "waitFor()"? Czy czeka na wykonanie mojego .exe lub czy czeka na zakończenie jego wykonywania?

Mój .exe jest skompilowanym skryptem AutoIt. Oznacza to, że mogą występować interakcje, takie jak ruchy myszy, które wymagają trochę czasu. Muszę wiedzieć, czy moje wykonywanie kodu Java jest włączone po wywołaniu pliku .exe lub czy naprawdę na niego czeka.

Co chcę osiągnąć jest wykonanie obrotowa dwóch skryptów, ale obawiam się, że mój kod Java jest wykonanie drugiego scenariusza, podczas gdy pierwsza z nich jest jeszcze uruchomiony. Czy ktoś obejście tego problemu? Cieszę się z wszelkich pomysłów.

+1

cytuję docs: „* Powoduje bieżący wątek czekać, jeśli to konieczne, aż proces reprezentowany przez ten obiekt procesów został zakończony Metoda ta zwraca niezwłocznie, jeżeli podproces został już zakończony. *.”. – Maroun

+0

Spójrz na [kiedy-runtime-exec --- won-t] (https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html). Istnieje dobry opis przypadków użycia 'Process.waitFor()'. – MockerTim

Odpowiedz

6

Aktualna gwint wykonanie zostanie zablokowana na process.waitFor() aż proces jest zakończona (tj wykonanie gotowego). Źródło here

Należy również zauważyć, że jeśli proces jest już zakończony: waitFor() nie zostanie zablokowany. Nie wiem, czy kod, który wpisujesz w swoim pytaniu, jest dokładnie tym, co uruchamiasz ... ale musisz być ostrożny i ponownie utworzyć nową instancję procesu dla każdego wykonania skryptu (tj. Nie tylko wywoływać wiele razy na początku ten sam proces: nie zadziała po pierwszym wykonaniu)

+0

OK, dzięki, że dałeś mi lepszy wgląd. Nie byłem pewien, jak "proces" jest zdefiniowany w dokumentach. Nie byłem pewien, czy "proces" oznacza proces wykonywania poleceń konsoli, czy też obejmuje ich pełne wykonanie. – KJaeg

1

Będzie czekać, aż proces się zakończy. Rozwiązanie:

1 Zastosowanie isAlive()

2 Zastosowanie waitfor (długi czas oczekiwania, jednostka TIMEUNIT) (tylko 1.8)

+0

Dzięki, będę o tym pamiętać podczas rozwoju. – KJaeg

2

Dodatkowo, jeśli istnieje wyjścia w "poleceń". powinieneś przeczytać standardowe wyjście i standardowe wyjście błędów przez stream(process.getErrorStream()) i process.getInputStream()). Jeśli nie, a wyjście lub wyjście błędów będzie pełne, wieszak waitfor() zostanie powieszony.