# Programm beendet - Thread läuft weiter



## Moruk (22. Mrz 2007)

Ich habe ein Java Programm geschrieben, dass den Eingang bei Port 9100 überwacht. (brauche ich für arbeit)
Der Ablauf ist so :
Ich rufe in der Main Klasse meinen externen Thread auf und dieser läuft weiter in einer Endlosschleife, bis die gewünschten Pakete ankommen. 
Habe nun das Programm als Windows-Dienst eingebaut, habe jetzt aber das Problem, dass wenn ich den Dienst beende, der Thread stetig weiterläuft. Die einzigste Möglichkeit die ich grad habe, ist den Thread über den Taskmanager abzuschießen.

Ich würde es gerne so hinbekommen, dass der Thread mit Beendigung des Dienstes/Programmes auch aufhört zu laufen.
Kann mir da jemand helfen ?


----------



## Marcel_Handball (22. Mrz 2007)

Wenn ich mich recht erinnere, wird beim Beenden des Programms die stop()-Methode nochmal aufgerufen. In dieser muss der Thread dann beendet werden.


----------



## Leroy42 (22. Mrz 2007)

Gute Frage!

Ich wüßte jetzt gar nicht was genau _den Dienst beenden_ eigentlich bei
einem Java-Programm bedeutet? Wird ihm dann _irgendetwas mitgeteilt_?  ???:L 


(Ich habe diesen Post nur geschrieben, um bei Folgeantworten
benachrichtigt zu werden, da mich dies auch interessiert   )


----------



## Leroy42 (22. Mrz 2007)

Marcel_Handball hat gesagt.:
			
		

> wird beim Beenden des Programms die stop()-Methode nochmal aufgerufen.



Was, um alles in der Welt, ist denn die stop()-Methode bei einer Java-Anwendung?  :shock:  :autsch:


----------



## Leroy42 (22. Mrz 2007)

Leroy42 hat gesagt.:
			
		

> Marcel_Handball hat gesagt.:
> 
> 
> 
> ...



So'ne Art Anti-main-Methode?


----------



## JPKI (22. Mrz 2007)

Setz den Thread doch auf 
	
	
	
	





```
setDeamon(true)
```


----------



## Moruk (22. Mrz 2007)

JPKI hat gesagt.:
			
		

> Setz den Thread doch auf
> 
> 
> 
> ...



hab ich schon gemacht. Leider läuft er trotzdem weiter.




			
				Marcel_Handball hat gesagt.:
			
		

> wird beim Beenden des Programms die stop()-Methode nochmal aufgerufen.




Listener funktionieren hier nicht. 

stop()-Methode  
 ???:L


----------



## JPKI (22. Mrz 2007)

Erklär mal genau, wie du das Ding startest und beendest! Und poste mal den relevanten Quelltext.


----------



## tfa (22. Mrz 2007)

Moruk hat gesagt.:
			
		

> JPKI hat gesagt.:
> 
> 
> 
> ...



Machst Du das, bevor der Thread gestartet wird?

tfa


----------



## Moruk (23. Mrz 2007)

```
public class Watcher {

    public Watcher() {}


    Tools t = new Tools();
    ConfigFile cf = new ConfigFile();

    public static void main(String[] args) {
        ConfigFile cf = new ConfigFile();
        Watcher pcs = new Watcher();
        if (cf.Karte.equals(cf.get(cf.MODE)) ){
            pcs.Watcher();
        } else{
          pcs.FalscherMode(); //Schreibt nur in den Logger 
        }
    }

    public void FalscherMode(){
       t.meinLogger(t.ERROR, "PrintCardServer STOPP - Falscher DAccS-Mode");
    }



    public void StarteWatcher() {
        String s;
        String az;
        Integer i = 0;
        boolean b = true;
        System.out.println("Start");
        t.startThread(true);  
        do {
            s = cf.get(cf.CUSTOM03);
            if (s.equals("Stop")) {
                ErstelleUndSchreibeAufSocket();  //Sendet eine Nachricht an den Socket **1**
                b = false;
            }
            try {
                Thread.sleep(100);
                SimpleDateFormat fmt = new SimpleDateFormat();
                fmt.applyPattern("HH:mm");
                Calendar cal = new GregorianCalendar();
                String time = fmt.format(cal.getTime());
                i++;
                az = String.valueOf(i);
                cf.set(cf.CUSTOM02, az + " - " + time + "Uhr");
            } catch (InterruptedException ex) {
            }
        } while (b);

        System.out.println("Ende");
//        if (t.Thread.isAlive()){
//            t.Thread.stop();
//        }
    }
```

Zu **1** :
Wenn ich eine bestimmte Nachricht an den Thread schicke, wird er beendet. Durch das beenden des Dienstes, beendet sich ja leider nur die Watcher Klasse. Wenn es eine Möglichkeit gibt, aus der Watcher-Klasse abzufangen, dass Sie beendet wird (ohne auf Funktionen der Windows API zuzugreifen, da das Programm auch auf anderen Plattformen laufen muss), wäre es kein Problem den Thread zu beenden.

Ich komme ursprünglich aus der Delphi-Programmierung und komme bei dem Problem einfach nicht weiter.


----------



## Moruk (23. Mrz 2007)

Ach und diese Methode startet dann den Thread:


```
public boolean startThread(boolean echtNeuStarten) {
        meinLogger(INFO, "Tools.startThread");
        // Thread starten

        if (Thread == null) {
            meinLogger(INFO, "Tools.Thread Thread == null");
        } else {
            meinLogger(INFO, "Tools.Thread Thread != null");
            State state = osaCardServerThread.getState();
            meinLogger(INFO, "Thread state=" + state.toString());
            meinLogger(INFO, "Tools.Thread isAlive=" + osaCardServerThread.isAlive());
        }

        if (server == null) {
            meinLogger(INFO, "Tools.Thread server == null");
        } else {
            meinLogger(INFO, "Tools.Thread server != null");
            meinLogger(INFO, "Tools.Thread server.isBound=" + server.isBound());
            meinLogger(INFO, "Tools.Thread server.isClosed=" + server.isClosed());
        }

        if (echtNeuStarten) {
            Thread = new Thread(new Thread());
            Thread.setDaemon(true);
            Thread.start();
            return true;
        }

        if (Thread == null) {
            if (server == null) {
                meinLogger(INFO, "", "Tools.Thread START thread==null server==null");
                Thread = new Thread(new Thread());
                Thread.setDaemon(true);
                Thread.start();
            }
            if (server != null) {
                if (server.isClosed()) {
                    meinLogger(INFO, "", "Tools.Thread START thread==null server.isClosed()");
                    Thread = new Thread(new Thread());
                    Thread.setDaemon(true);
                    Thread.start();
                }
            }
        } else {
            if (server == null) {
                meinLogger(INFO, "", "Tools.Thread START thread!=null server==null");
                Thread = new Thread(new Thread());
                Thread.setDaemon(true);
                Thread.start();
            }
            if (server != null) {
                if (server.isClosed()) {
                    meinLogger(INFO, "", "Tools.Thread START thread!=null server.isClosed()");
                    Thread = new Thread(new Thread());
                    Thread.setDaemon(true);
                    Thread.start();
                }
            }
        }
        return true;
    }
```

(Variablen leicht verändert, bekomm sonst Ärger vom Cheff)


----------



## Moruk (23. Mrz 2007)

Mann oh Mann, das Problem wird immer größer. 
Wenn ich den Dienst Watcher unter Windows beende, läuft selbst die Hauptklasse Watcher weiter  :? 

Weiß nun gar net mehr, was ich machen soll


----------

