Thread.sleep(100) und process.waitFor() blockieren Prozess/ProzessBuilder

  • Themenstarter Themenstarter Toni86
  • Beginndatum Beginndatum
Hi.

Kann es sein, das evtl. der Client eine Exception wirft? Diese wird ja gerne mal länger und vermutlich auf die Standarderrorausgabe geschrieben. Wenn der Puffer der Standarderrorausgabe voll läuft und niemand die Ausgabe ausliest, blockiert der Client.

Kombiniere Standarderror- und Standardausgabe (redirectErrorStream) und lies die Ausgabe während du auf Beendigung des Clients wartest und schließe den OutputStream des Prozesses.

Gruß
 
Hallo,

der Client läuft fehlerfrei. Wenn ich ihn nicht aus dem Programm heraus, sondern händisch über die Konsole starte (Server ebenfalls) funktioniert alles.
Es ist sogar so: wenn ich zB 30 Sekunden auf den Client warte, wird er 30 Sekunden lang blockiert (Server meldet "Client timeout"), denn wenn ich danach ohne die Ergebnisdatei weitermache, läuft auch der Client plötzlich (aber zu spät) und der Server meldet keinen Timeout mehr.

Grüße,
Toni
 
Gut ... ich versuch es jetzt mal so auszudrücken : Ich muss meine Glaskugel erst noch vom Boden kratzen.

Vielleicht kannst du dir dann n Plan machen was du schreiben solltest anstellen dem was du bisher geschrieben hast.

PS an die andere : last mir bitte wenigstens das einemal den Spass =P
 
GELÖST: Thread.sleep(100) und process.waitFor() blockieren Prozess/ProzessBuilder

Hallo,

für die Nachwelt: ich habe das Problem selbst gelöst. Der Prozess wurde blockiert, weil durch Thread.sleep die komplette JVM einschläft, also auch das gestartete Java-Programm. Damit viel diese Möglichkeit ganz weg. Die Variante mit process.waitFor() hat das gestartete Programm blockiert, weil der Prozess die ganze Zeit damit beschäftigt war, über Streams zu kommunizieren, was ich aber nicht benötigte. Ergo: Zur Lösung des Problems habe ich die Streams geschlossen und schon funktionierte alles. process.waitFor() wartet nun bis der Prozess zu Ende ist und dann gehts weiter im Hauptprogramm.

Hier der Code:
Code:
	// Start the process
	clientProcess = Runtime.getRuntime().exec(commandRunClient);
	
	// Close all streams because they are uninteresting and otherwise the
	// program would wait endlessly for the termination of the process
	clientProcess.getErrorStream().close();
	clientProcess.getInputStream().close();
	clientProcess.getOutputStream().close();
	
	// Wait until the client was terminated
	System.out.println("Waiting while Client is running...");
	clientProcess.waitFor();
	System.out.println("...done!");
 
für die Nachwelt: ich habe das Problem selbst gelöst. Der Prozess wurde blockiert, weil durch Thread.sleep die komplette JVM einschläft, also auch das gestartete Java-Programm.
Das glaube ich nicht bzw. ist Unsinn.
Damit viel diese Möglichkeit ganz weg. Die Variante mit process.waitFor() hat das gestartete Programm blockiert, weil der Prozess die ganze Zeit damit beschäftigt war, über Streams zu kommunizieren, was ich aber nicht benötigte.
Was ich dir bereits sagte...

Gruß
 
// EDIT : deepthroat war schneller

Das mit dem Thread.sleep() :
das glaub ichauch nicht weil du damit nur die Methode aufrufst. Wenn du einen Thread warten lassen willst musst du die entsprechende Klasse schon von Thread ableiten und dann this.sleep() aufrufen > DOC

Aber wer das mit der Glaskugel nich versteht und nich in die Doc guckt und dann noch Unsinn erzählt ... der steht echt aufm Schlauch
 
Zuletzt bearbeitet von einem Moderator:
Was ich dir bereits sagte...

Sorry, das habe ich aus deiner Antwort nicht herausgelesen. Das Klang mehr danach, dass ich die Streams auswerten und nach Fehlern durchsuchen sollte. Ich war mir jedoch sicher, dass der Client fehlfrei lief und habe mir die Streams nicht angeschaut. Das "Schließen des OutputStreams" war wohl das Schlüsselwort, aber das klang für mich auch nur nach "schließe die Datei auch wieder, wenn du mit ihr fertig bist".
 
Aber wer das mit der Glaskugel nich versteht und nich in die Doc guckt und dann noch Unsinn erzählt ... der steht echt aufm Schlauch

Hallo,

du hast meinen Beitrag bisher nur zugespamt und versucht, irgendwem irgenwelche Witze aufzudrängen. So machst du dir keine Freunde. Arbeite mal an deiner Menschlichkeit oder fang an zu studieren!

Gruß
 
Naja is aber nur die Wahrheit ...
Wir haben dir genug Punkte gegeben um dir zu helfen und vergeblich nach Source gebettelt. Wenn du schon so große Töne spuckst dann hättest du hier garnicht erst fragen brauchen. Und so einen wirklich DUMMEN Fehler wie Thread.sleep() hätte man wirklich vermeiden können wenn man mal die Lust gehabt hätte sich die nötigen Doc-Seiten durchzulesen in denen eigentlich deine Problemlösung drinsteht.

Um mal den Punkt Glaskugel zu erläutern : DIR KANN KEINER HELFEN WENN DU KEINEN SOURCE POSTEST ! Aber das haben wir dir ja vergeblich versucht mitzuteilen.
 
Zurück