Hallo Alle zusammen,
ich brauche mal Rat von einem alten Java-Hasen:
ich habe ein Programm, das in zyklischen Abständen einen Ordner auf Dateien checkt und wenn vorhanden, eine Bildverarbeitung darauf anwendet. Das Programm läuft in einer endlosen WHILE-Schleife mit einem Flag als Abbruchbedingung. Wenn das Programm beendet werden soll, wird das mit einem "kill" passieren müssen. Damit das Programm aber nicht mitten in einer Bildverarbeitung unterbrochen wird, benötigt es einen Schutz, damit wenigstens noch die aktuelle Datei fertig abgearbeitet wird.
Ich habe es mit einem ShutdownHook probiert, aber das macht nicht, was ich von ihm erwarte:
-Anlegen eines ShutdownHook in einer eingebetteten Klasse:
-Der Hook wird im Konstruktor der Hauptklasse initialisiert:
-Mein Gedanke hierbei: Die Aktion 'Programm Beenden' (das kill) wird vom ShutdownHook abgefangen; In der Klasse MyShutdownHook wird die Abbruchbedingung für die while-Schleife im Haupthread gesetzt, die Schleife steigt nach einem KOMPLETTEN Durchlauf aus und die Anwendung kann beendet werden. Soweit die Theorie. Hier die Praxis:
Ich bin leider nicht so thread safe d.h. wenn jemand damit Erfahrung hat und helfen könnte, wäre das super. Evtl. gibts ja ein anderes Konzept, was hier besser passt?
Danke
Albrecht
ich brauche mal Rat von einem alten Java-Hasen:
ich habe ein Programm, das in zyklischen Abständen einen Ordner auf Dateien checkt und wenn vorhanden, eine Bildverarbeitung darauf anwendet. Das Programm läuft in einer endlosen WHILE-Schleife mit einem Flag als Abbruchbedingung. Wenn das Programm beendet werden soll, wird das mit einem "kill" passieren müssen. Damit das Programm aber nicht mitten in einer Bildverarbeitung unterbrochen wird, benötigt es einen Schutz, damit wenigstens noch die aktuelle Datei fertig abgearbeitet wird.
Ich habe es mit einem ShutdownHook probiert, aber das macht nicht, was ich von ihm erwarte:
-Anlegen eines ShutdownHook in einer eingebetteten Klasse:
Code:
private class MyShutdownHook extends Thread {
@Override
public void run() {
log.SetLogmessage("Die Anwendung wird jetzt heruntergefahren.", enumLoglevel.SEVERE);
StopSearch(); //Setzt die Abbruchbedingung in der While-Schleife
log.SetLogmessage("Abgeschaltet.", enumLoglevel.SEVERE);
log.CloseLogger();
//ruft den Garbage Collector auf
this.finalize();
}
}
Code:
//Füge den Shutdown-Hook hinzu
MyShutdownHook objShutdownhook = new MyShutdownHook();
Runtime.getRuntime().addShutdownHook(objShutdownhook);
- Es scheint so, daß beim Beenden-Signal zuerst der Hauptthread (In dem Fall die While-Schleife) abgebrochen wird, bevor der ShutdownHook aktiviert wird (das Log zeigt keine Aktivitäten mehr in der Schleife). Wenn das der Fall ist, ist die ganze Überlegung falsch und es müsste ein anderes Konzept her.
- Da die Initialisierung des ShutdownHook im Konstruktor stattfindet (wo auch der Haupthread angestoßen wird), wird beim Beenden wohl nochmal in den Konstruktor gegangen und der Code dort ausgeführt, d.h. ein 2. Haupthread gestartet. Möglicherweise hängt 1.) auch mit 2.) zusammen. Ich habe auch probiert, den Shutdownhook in einer separaten Funktion unterzubringen, die nichts mit dem Haupthread zu tun hat, aber dann ist der Hook gar nicht ausgeführt worden.
- Hello World wird im Hook ausgeführt, aber die Bildverarbeitung wohl nicht. Ich habe gelesen, dass keine unfangreichen Aktionen mehr durch den Hook ausgeführt werden sollen. Evtl. ist das zu viel?
Ich bin leider nicht so thread safe d.h. wenn jemand damit Erfahrung hat und helfen könnte, wäre das super. Evtl. gibts ja ein anderes Konzept, was hier besser passt?
Danke
Albrecht