Kürzlich habe ich eine Swing-Anwendung in Webstart konvertiert. Der Prozess war ziemlich einfach, aber ich fand, dass nach dem Schließen aller Fenster die JVM der Anwendung nicht beendet wurde. Der Thread-Dump zeigte, dass es einige Nicht-Daemon-Threads gibt, insbesondere Swing's EDT, AWT und einige websart-bezogene Threads.
Die tatsächlich verwendete Strategie besteht darin, dass jedes Fenster beim Erstellen einen Zähler inkrementiert und beim Schließen einen Zähler dekrementiert. Der standardmäßige Schließvorgang ist DISPOSE_ON_CLOSE. Wenn der Zähler Null erreicht, höre ich alle Threadpools auf und gebe alle JNI-Ressourcen frei.
Als ich die Anwendung von einer Fledermaus-Datei (gleiche JARs) gestartet habe, endete es gut, als alle Fenster geschlossen wurden, also dachte ich, dass das Problem etwas mit Webstart zu tun hat.
Jetzt die Fragen:
Siehe auch Folgefrage zum Erkennen, ob die App von Webstart gestartet wurde.
Wegen Fehlern in WebStart, ja. WebStart startet einen "sicheren Thread" für seine eigenen Zwecke, der mit dem EDT interagiert. Dieser SecureThread verhindert die automatische Beendigung des Java-Prozesses, den man erwarten würde, wenn alle Windows- und AWT-Ressourcen entsorgt werden.
Weitere Informationen finden Sie unter Ссылка
Der AWT EDT ist normalerweise der Schuldige. Seit einigen Jahren hat es eine gewisse Logik, um abzuschalten, wenn es keine unangepassten Fenster gibt. Es gibt jedoch immer wieder Probleme mit Lecks, einschließlich der Implementierung von AWT und Swing. Daher empfehle ich dringend, System.exit in Produktionsversionen zu verwenden (möglicherweise möchten Sie es für einige Tests auslassen, um Lecks zu erkennen).
Der WebStart-Thread sollte allesamt Daemon sein, wenn keine Systemfenster (Konsole, javax.jnlp-Dienste und andere Dialoge) angezeigt werden.
Webstart startet das Konsolenfenster (Sie können es möglicherweise deaktivieren). Das Konsolenfenster wird verwendet, um stdout / err des Webstart-Prozesses sowie rudimentäres log / debug zu sehen, hat aber als Nebeneffekt ein AWT / Swing-Fenster auf oberster Ebene. Da der AWT / EDT nur endet, wenn das Fenster LAST geschlossen ist, hält das Konsolenfenster Ihre Anwendung aufrecht. Sie sollten wahrscheinlich System.exit () aufrufen, um 100% sicher zu sein, dass Ihre Anwendung beendet wird (es sei denn, Sie können eine bestimmte Client-Konfiguration garantieren, webstart console ausgeschaltet)
Ziehen Sie in Betracht, sich mit jconsole zu verbinden und schauen Sie sich an, was die JVM tut.
Tags und Links java swing java-web-start