Sie sollten nicht System.exit()
aufrufen, wenn Sie ihm helfen können.
Der beste Weg, um einen Java-Prozess zu beenden, besteht darin, dass alle Threads normal beendet werden. Dies wird die VM beenden.
In deinem Haupt JFrame
solltest du setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
.
Dann können Sie frame.dispose()
aufrufen, um JFrame
zu schließen und den EDT zu beenden.
Sie können es von jedem Thread aus aufrufen, aber es ist irgendwie unhöflich, es IMHO zu benutzen. Die virtuelle Maschine wird beendet, egal was sonst noch läuft.
Ich bevorzuge dispose()
oder schließe einfach (mit setDefaultCloseOperation(DISPOSE_ON_CLOSE)
) jedes angezeigte Fenster (JFrame, JDialog, ...). Wenn nur Daemon-Threads ausgeführt werden, wird die virtuelle Maschine beendet. Wenn es einen Live-Nicht-Daemon-Thread gibt, wird die JVM nicht beendet und der Thread kann seine Arbeit beenden.
Wenn ich dies tue, kann ich immer ein Programm in ein anderes Programm einfügen, ohne sich Sorgen machen zu müssen, wenn eines der Programme versehentlich das andere beendet.
Es gibt sehr wenige Situationen, in denen die JVM wirklich "getötet" werden musste ...
System.exit()
beendet nicht die laufenden Threads, sondern die virtuelle Maschine selbst. So kann es von welchem Thread auch immer aufgerufen werden, das Ergebnis ist immer dasselbe, und wenn die VM stirbt, sind alle möglichen inkonsistenten Zustände in Threads auf einmal nicht vorhanden.
Es ist absolut nichts falsch daran, System.exit von einem beliebigen Thread aus aufzurufen. Es "normal" zu verlassen, funktioniert in der Praxis nicht, weil Sie feststellen werden, dass die App hängen bleibt, während der GC Dinge sammelt, bevor die App beendet wird. Ich habe Tonnen von gui Swing-Apps geschrieben, und es ist absolut nichts falsch daran, es anzurufen. Es ist auch nicht "unhöflich". Es ist der Java-Weg.
Es gibt Swing-Regeln, damit der EDT-Thread normal beendet wird.
Am wichtigsten ist es sicherzustellen, dass alle Frames entsorgt wurden. Leider ist das nicht so einfach, wenn Sie modale Dialoge ohne Eltern verwenden, da Swing einen unsichtbaren Eltern-Rahmen für solche Dialoge erzeugt.
In diesem Fall müssen Sie alle Frames auflisten (dafür können Sie Frame.getFrames()
verwenden) und explizit dispose()
sie.
Natürlich musst du sicherstellen, dass kein Thread
am Leben ist (außer Dämonen). Einige Bibliotheken und sogar einige APIs von JDK erstellen Nicht-Daemon-Threads, die Sie selbst herunterfahren müssen.
Schließlich, und am wichtigsten, wird das Aufrufen von System.exit () in einer Java Web Start-Umgebung nicht funktionieren (sehen Sie sich diese SO-Frage , um weitere Informationen zu finden."
Abschließend wäre mein Rat, tatsächlich System.exit()
aufzurufen, weil Sie nicht immer wissen, in welcher Umgebung Ihre Anwendung gestartet wird. Aber ich möchte einen wichtigen Punkt hinzufügen: Stellen Sie sicher, dass Sie einen einzigen Punkt haben, von dem aus der Exit ausgeführt wird. Der Aufruf von jeder Thread ist OK.