Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
AppletAlle Threads beim schließen des Applets beenden
Ich habe ein Applet, in dem ich einen neuen Thread starte. Wird das Fenster geschlossen, bleibt der Thread offen (Das sehe ich daran, dass er Daten an einen Server sendet). Ich habe den Thread bereits zu Daemon gemacht und in der destroy-Methode des Applets ein System.exit(0) ausgeführt.
Aber so wirklich auskennen tust du dich mit Applets nicht oder ?
Ein Applet hat einen fest definierten Lebenszyklus :
Laden des Applets
Konstruktor callen
init() callen
start() callen
Und dann läuft das Applet erstmal.
Je nach implementierung gibt es dann verschiedene Verwendungszwecke für stop() : entweder wird es gecallt wenn das Applet aus dem sichtbaren Bereich rausläuft oder der Tab inaktiv wird.
destroy() wird grundsätzlich erst gecallt wenn die Seite wirklich geschlossen wird. Also Tab schließen oder andere Seite aufrufen. Und erst damit ist dann das Leben des Applets vorbei.
Dessweiteren ist System.exit() in einem Applet NICHT erlaubt (zumindest nicht ohne Signatur). Also müsste es eigentlich schon beim Laden eine Fehlermeldung geben das diese Aktion unzulässig ist. Und diese verhindert dann in der Regel das Laden des Applets komplett. Ausnahme : Signatur
Und auch ist die Frage : WELCHES Fenster ? Der Browser-Tab oder ein eigenes J/Frame ?
Und wenn auf deinem Server irgendwas weiter läuft hast du bei der Implementierung geschlampt und räumst die Resourcen nicht sauber auf.
Aber so wirklich auskennen tust du dich mit Applets nicht oder ?
Ein Applet hat einen fest definierten Lebenszyklus :
Laden des Applets
Konstruktor callen
init() callen
start() callen
Und dann läuft das Applet erstmal.
Je nach implementierung gibt es dann verschiedene Verwendungszwecke für stop() : entweder wird es gecallt wenn das Applet aus dem sichtbaren Bereich rausläuft oder der Tab inaktiv wird.
destroy() wird grundsätzlich erst gecallt wenn die Seite wirklich geschlossen wird. Also Tab schließen oder andere Seite aufrufen. Und erst damit ist dann das Leben des Applets vorbei.
Dessweiteren ist System.exit() in einem Applet NICHT erlaubt (zumindest nicht ohne Signatur). Also müsste es eigentlich schon beim Laden eine Fehlermeldung geben das diese Aktion unzulässig ist. Und diese verhindert dann in der Regel das Laden des Applets komplett. Ausnahme : Signatur
Und auch ist die Frage : WELCHES Fenster ? Der Browser-Tab oder ein eigenes J/Frame ?
Und wenn auf deinem Server irgendwas weiter läuft hast du bei der Implementierung geschlampt und räumst die Resourcen nicht sauber auf.
Was soll ich denn machen, damit das Applet vollständig beendet wird, wenn das Tab geschlossen wird. Auf meinem Server läuft nicht "Irgendwas weiter", sondern das Applet schickt auch nach dem Schließen des Tabs Anfragen.
Wenn du System.exit(0) in einem Applet verwendest, wird dir deine Anwendung höchstwahrscheinlich eine Runtime Security Exception werfen, da, wie schon erwähnt, ein Applet so ohne Weiteres nicht beendet werden kann, auch nicht mit System.exit(0). Normalerweise wird ein Applet nur dann
beendet, wenn du die Seite wechselt oder den Browser schließt. Nachdem du nun den Browser geschlossen hast, sollten nun alle Prozesse beendet werden, also auch die JVM.
Du sagst ja, dass deine Threads bzw. Streams, nach dem Schließen des Browsers im Hintegrund weiterlaufen. Das kann zum einen daran liegen, dass du die offenen Threads nicht gestoppt hast.
Ich würde immer so etwas machen wenn du den Thread beenden möchtest.
Java:
Thread td = new Thread();
td.interrupt(); // td.stop() ist deprecated und sollte nicht mehr verwendet werden.
td = null;
Es kann zum anderen aber auch daran liegen, dass du Socket und Streams nicht in der destroy()-Methode des Applets geschlossen hast.
Ich hoffe, dass ich dir weiterhelfen konnte, aber ich würde trotzdem noch einmal über den Quellcode schauen, ob du nicht doch irgendwo etwas vergessen hast zu schließen oder zu beenden und ob du alle vordefinierten Thread und Applet Methoden richtig überschrieben hast.
Ich habe jetzt mal in die Javakonsole gesehen und bekomme dort oft folgende Exception:
plugin2manager.parentwindowDispose
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at sun.plugin2.message.Queue.waitForMessage(Unknown Source)
at sun.plugin2.message.Pipe$2.run(Unknown Source)
at com.sun.deploy.util.Waiter$1.wait(Unknown Source)
at com.sun.deploy.util.Waiter.runAndWait(Unknown Source)
at sun.plugin2.message.Pipe.receive(Unknown Source)
at sun.plugin2.main.client.MessagePassingExecutionContext.doCookieOp(Unknown Source)
at sun.plugin2.main.client.MessagePassingExecutionContext.setCookie(Unknown Source)
at sun.plugin2.main.client.PluginCookieSelector.setCookieInBrowser(Unknown Source)
at com.sun.deploy.net.cookie.DeployCookieSelector.setCookieInfo(Unknown Source)
at com.sun.deploy.net.cookie.DeployCookieSelector.put(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at Snakes$1.run(Snakes.java:158)
Wenn ich die Exception jedoch in Zeile 158 mit einem Tryblock umgebe und die InterruptedException abfangen will, sagt Eclipse, diese werde nie geworfen.
Der ganze Code wäre jetzt etwas lang. In Zeile 158 steht:
rd = new BufferedReader(new InputStreamReader(inCon.getInputStream()));
Wie aus der Fehlermeldung ersichtlich wird dort wait() aufgerufen und wenn der Thread zu diesem Zeitpunkt unterbrochen wird eine Exception geworfen (die ich aber aus irgendeinem Grund nicht abfangen darf...).