Hallo zusammen,
ich habe eine Anwendung programmiert, die einen ShutdownHook implementiert. Wenn die Anwendung durch ein kill -15 oder Schließen des Eingabefensters beendet wird, initiiert der Hook einen neuen Thread. In diesem Thread wird die statische Methode einer zweiten Klasse aufgerufen, die einen Flag als Abbruchbedingung für eine Endlosschleife setzt. Soweit läuft alles klar. Die Schleife steigt an der richtigen Stelle aus, so dass ein geregeltes Beenden möglich ist.
Was nicht mehr funktioniert, ist das logging. Ab dem Moment, wo der Thread in der zweiten Klasse die statische Methode ausführt, wird im Hauptthread nichts mehr gelogt. Ich versuche das mal codemäßig zusammenzufassen:
[HIGHLIGHT="Java"]public class Einstiegsklasse{
public static void main(String[] args) {
Logging log=new Logging();
//Hier wird die zweite Klasse initialisiert
FileSystemHandling FS=new FileSystemHandling(log);
addDaemonShutdownHook();
}
//Hier ist der Hook als embedded class
static protected void addDaemonShutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Einstiegsklasse.Shutdown();
}
});
}
public static void Shutdown() {
//Hier wird die statische Methode StopSearch der Klasse FileSystemHandling aufgerufen
FileSystemHandling.StopSearch();
try {
getMainDaemonThread().join();
} catch (InterruptedException ex) {
//log.SetLogmessage("Der abgesicherte Shutdownprozess konnte nicht durchgeführt werden.", enumLoglevel.SEVERE, ex);
}
}
}
public class FileSystemHandling{
Logging mylog;
boolean theFlag;
FileSystemHandling(Logging log){
mylog=log;
theFlag=true;
Hauptmethode();
}
//Hier ist die Endlosschleife
//Die wird tatsächlich abgebrochen, wenn theFlag=false, aber ab dem Zeitpunkt, wo der Thread vom
//Shutdown-Hook die Methode StopSearch() ausgeführt hat, wird in der Schleife nichts mehr gelogt!!!!
Hauptmethode(){
while(theFlag){
//Mach was und logge
mylog.schreibwas("",Level.INFO);
//Mach nochwas und logge
mylog.schreibwas("",Level.WARNING);
//...
}
}
//Hier wird die Abbruchbedingung gesetzt
public static StopSearch(){
theFlag=false;
}
}[/HIGHLIGHT]
Ist das tatsächlich so, daß das Java-logging nicht thread save ist, oder entdeckt jemand einen Fehler im Programm? In der logging api-doc wird auf jeden Fall behauptet, daß die Klasse thread save ist. Sieht allerdings nicht so aus!
Grüße
Albrecht
ich habe eine Anwendung programmiert, die einen ShutdownHook implementiert. Wenn die Anwendung durch ein kill -15 oder Schließen des Eingabefensters beendet wird, initiiert der Hook einen neuen Thread. In diesem Thread wird die statische Methode einer zweiten Klasse aufgerufen, die einen Flag als Abbruchbedingung für eine Endlosschleife setzt. Soweit läuft alles klar. Die Schleife steigt an der richtigen Stelle aus, so dass ein geregeltes Beenden möglich ist.
Was nicht mehr funktioniert, ist das logging. Ab dem Moment, wo der Thread in der zweiten Klasse die statische Methode ausführt, wird im Hauptthread nichts mehr gelogt. Ich versuche das mal codemäßig zusammenzufassen:
[HIGHLIGHT="Java"]public class Einstiegsklasse{
public static void main(String[] args) {
Logging log=new Logging();
//Hier wird die zweite Klasse initialisiert
FileSystemHandling FS=new FileSystemHandling(log);
addDaemonShutdownHook();
}
//Hier ist der Hook als embedded class
static protected void addDaemonShutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
Einstiegsklasse.Shutdown();
}
});
}
public static void Shutdown() {
//Hier wird die statische Methode StopSearch der Klasse FileSystemHandling aufgerufen
FileSystemHandling.StopSearch();
try {
getMainDaemonThread().join();
} catch (InterruptedException ex) {
//log.SetLogmessage("Der abgesicherte Shutdownprozess konnte nicht durchgeführt werden.", enumLoglevel.SEVERE, ex);
}
}
}
public class FileSystemHandling{
Logging mylog;
boolean theFlag;
FileSystemHandling(Logging log){
mylog=log;
theFlag=true;
Hauptmethode();
}
//Hier ist die Endlosschleife
//Die wird tatsächlich abgebrochen, wenn theFlag=false, aber ab dem Zeitpunkt, wo der Thread vom
//Shutdown-Hook die Methode StopSearch() ausgeführt hat, wird in der Schleife nichts mehr gelogt!!!!
Hauptmethode(){
while(theFlag){
//Mach was und logge
mylog.schreibwas("",Level.INFO);
//Mach nochwas und logge
mylog.schreibwas("",Level.WARNING);
//...
}
}
//Hier wird die Abbruchbedingung gesetzt
public static StopSearch(){
theFlag=false;
}
}[/HIGHLIGHT]
Ist das tatsächlich so, daß das Java-logging nicht thread save ist, oder entdeckt jemand einen Fehler im Programm? In der logging api-doc wird auf jeden Fall behauptet, daß die Klasse thread save ist. Sieht allerdings nicht so aus!
Grüße
Albrecht