2015-04-20 14 views
6

Ich führe eine .exe-Datei von Java, mit der ProcessBuilder Klasse und der Process Klasse. Um zu erklären, was ich mache:ProcessBuilder und Process.waitFor(), wie lange dauert es?

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

Ich wollte nur wissen, wie lange wartet "waitFor()"? Wartet es, bis meine .exe ausgeführt wird, oder wartet es, bis seine Ausführung beendet ist?

Meine .exe ist ein kompiliertes AutoIt-Skript. Das bedeutet, dass es Wechselwirkungen wie Mausbewegungen geben kann, die einige Zeit brauchen. Also muss ich wissen, ob meine Java-Code-Ausführung nach dem Aufruf der .exe weitergeht oder ob sie wirklich darauf wartet.

Was ich erreichen möchte, ist die rotierende Ausführung von zwei Skripten, aber ich fürchte, dass mein Java-Code das zweite Skript ausführt, während das erste noch läuft. Hat jemand einen Workaround dafür? Ich bin froh für irgendwelche Ideen.

+1

Ich zitiere die Dokumentation: "* Bewirkt, dass der aktuelle Thread ggf. wartet, bis der von diesem Process-Objekt dargestellte Prozess beendet ist. Diese Methode kehrt sofort zurück, wenn der Subprozess bereits beendet wurde. *". – Maroun

+0

Werfen Sie einen Blick auf [when-runtime-exec --- won-t] (https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html)). Es gibt eine gute Beschreibung der Anwendungsfälle 'Process.waitFor()'. – MockerTim

Antwort

6

Ihr aktueller Ausführungsthread wird auf process.waitFor() blockiert, bis der Prozess beendet ist (d. H. Ausführung beendet). Quelle here

Beachten Sie auch, wenn der Prozess bereits beendet ist: waitFor() wird nicht blockiert. Ich weiß nicht, ob der Code, den Sie in Ihre Frage eingeben, genau das ist, was Sie ausführen ... aber Sie müssen vorsichtig sein und eine neue Instanz von Process für jede Ausführung Ihres Skripts neu erstellen (dh nicht nur mehrmals aufrufen der gleiche Prozess: es wird nicht nach der ersten Ausführung funktionieren)

+0

OK, danke für mehr Einsicht. Ich war mir nicht sicher, wie "Prozess" in den Dokumenten definiert ist. Ich war mir nicht sicher, ob "Prozess" den Prozess der Ausführung nur der Konsolenbefehle bedeutet oder ob sie ihre vollständige Ausführung beinhaltet. – KJaeg

1

Es wird gewartet, bis der Prozess beendet ist. Lösung:

1 Verwendung IsAlive()

2 Verwenden waitFor (long-Timeout, Timeunit unit) (1,8)

+0

Danke, das werde ich bei der Entwicklung berücksichtigen. – KJaeg

2

Zusätzlich Wenn es Ausgänge in den "Befehlen". Sie sollten die Standardausgabe und Standardfehlerausgabe durch stream(process.getErrorStream()) und process.getInputStream()) lesen. Wenn nicht und Ausgabe oder Fehlerausgabe voll sind, würde die waitfor() gehängt werden.