Aus welchem ​​Thread soll System.exit () in einer Swing-App aufgerufen werden?

8

In einer Swing-App ist es in Ordnung, System.exit() von einem beliebigen Thread aufzurufen? (z.B. auf dem EDT?)

    
Anon 19.07.2010, 14:08
quelle

6 Antworten

6

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.

    
jjnguy 19.07.2010, 14:24
quelle
5

Da die VM nach dem System.exit() -Aufruf beendet wird, glaube ich nicht, dass es einen Unterschied macht, aus welchem ​​Thread der Aufruf gemacht wird.

    
perdian 19.07.2010 14:10
quelle
3

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 ...

    
Carlos Heuberger 19.07.2010 14:24
quelle
1

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.

    
Andreas_D 19.07.2010 14:16
quelle
1

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.

    
Mike 20.07.2010 03:04
quelle
0

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.

    
jfpoilpret 20.07.2010 01:59
quelle

Tags und Links