T
Toni86
Hallo,
ich habe folgendes Problem: ich starte aus einem Java-Programm (P1) ein anderes Java-Programm (P2, Client). Dieses kommuniziert mit (P3, Server, unwichtig) und erzeugt nach einer unbestimmten aber endlichen Zeit eine Datei und wird beendet. Nachdem ich von P1 aus P2 gestartet habe, möchte ich als nächstes die von P2 erzeugte Datei lesen, ich muss also darauf warten.
P2 starte ich mittels
oder über einen ProcessBuilder; macht hier bez. meines Problems aber keinen Unterschied. Falls ich es über Runtime mache, kann ich zum Warten
verwenden. Wenn ich es über ProcessBuilder mache, habe ich eine Schleife, die immer per
wartet und dann prüft, ob die Datei erzeugt wurde.
In beiden Fällen stelle ich Fest, dass P2 unterbrochen oder blockiert wird, da P3 (der Server) "Client timeout" meldet. Wenn ich nicht auf die Datei warte, und P1 ohne die erwartete Datei beendet wird, läuft P2 ohne "Client timeout" weiter. Es liegt also definitiv daran, dass waitFor() und Thread.sleep() den Prozess blockieren. Meine Frage: Kann man das verhindern? Wenn ja, wie?
Hier ein Code-Auszug für den Fall mit ProcessBuilder:
Viele Grüße,
Toni
ich habe folgendes Problem: ich starte aus einem Java-Programm (P1) ein anderes Java-Programm (P2, Client). Dieses kommuniziert mit (P3, Server, unwichtig) und erzeugt nach einer unbestimmten aber endlichen Zeit eine Datei und wird beendet. Nachdem ich von P1 aus P2 gestartet habe, möchte ich als nächstes die von P2 erzeugte Datei lesen, ich muss also darauf warten.
P2 starte ich mittels
Code:
process = Runtime.getRuntime().exec(commandRunClient);
Code:
process.waitFor();
Code:
Thread.sleep(1000);
In beiden Fällen stelle ich Fest, dass P2 unterbrochen oder blockiert wird, da P3 (der Server) "Client timeout" meldet. Wenn ich nicht auf die Datei warte, und P1 ohne die erwartete Datei beendet wird, läuft P2 ohne "Client timeout" weiter. Es liegt also definitiv daran, dass waitFor() und Thread.sleep() den Prozess blockieren. Meine Frage: Kann man das verhindern? Wenn ja, wie?
Hier ein Code-Auszug für den Fall mit ProcessBuilder:
Code:
ProcessBuilder pb;
Process processController;
try {
String commandRunClient = "command to start... specified somewhere else";
pb = new ProcessBuilder("cmd", "/c", commandRunClient);
processController = pb.start();
} catch (IOException e) {
System.out.println("evaluate(): error while trying to run the Controller");
e.printStackTrace();
}
// Waiting for the file with the results or for timeout
File resultsfile = new File(resultsFilename);
boolean timeout = false;
int seconds = 0;
while ((!resultsfile.exists()) && (!timeout)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("evaluate(): interrupted while waiting for the results");
e.printStackTrace();
}
seconds++;
if (seconds > 90) {
timeout = true;
processController.destroy();
}
}
Viele Grüße,
Toni