2016-06-29 20 views
1

Ich habe eine Befehlszeile, die mehr als 5 Minuten verarbeiten. Wenn ich die Befehlszeile mit ProcessBuilder aufruft funktioniert der Befehl mit 5 Minuten.Warum hängt Process Builder in Java nach 5 Minuten?

Während der Prozess hängt, wenn es mehr als 5 Minuten dauert und zeigt keine Verbesserung im Prozess, bis ich den Prozess beenden.

p = new ProcessBuilder("myprogram","with","parameter").start(); 
p.waitFor(); 

Bitte lassen Sie mich wissen, wenn Sie die obige Frage nicht verstehen?

+0

@Matej Kormuths Antwort ist richtig. Sie sollten auf Standarddateideskriptoren achten, die einem Prozess zugeordnet sind. Der einfachste Weg, dies zu beheben, ist (für Anfänger) 'p = neuer ProcessBuilder (" Myprogramm "," mit "," Parameter "). InheritIO(). Start();" vorausgesetzt, Sie sind auf Java 7+. –

Antwort

2

Das Problem könnte sein, dass der Befehl "myprogram" eine Ausgabe erzeugt und Sie sie nicht lesen. Dies bedeutet, dass der Prozess blockiert wird, sobald der Puffer voll ist, und darauf wartet, dass Ihr Prozess weiterlesen kann. Ihr Prozess wartet wiederum darauf, dass der andere Prozess beendet wird (was nicht der Fall ist, weil er auf Ihren Prozess wartet, ...). Dies ist eine klassische Deadlock-Situation.

Sie müssen kontinuierlich aus dem Prozesseingangsstrom lesen, um sicherzustellen, dass er nicht blockiert.

Javadocs sagt:

Klasse Prozess

Da einige nativen Plattformen nur begrenzte Puffergröße für Standardeingabe und Ausgabeströme, Ausfall liefern umgehend den Eingang Stream zu schreiben oder den Ausgangsstrom gelesen von Der Subprozess kann dazu führen, dass der -Subprozess blockiert und sogar blockiert wird.

Fehler beim Löschen des Puffers des Eingabestreams (der zum Ausgang Stream des Unterprozesses führt) von Process kann zu einer Unterprozessblockierung führen.