Beenden Sie eine Anwendung, die anmutig?
Ich habe eine Anwendung mit einem definierten Try/Catch/Finally-Kette, die Ausfahrten und führt finally-block nur in Ordnung, unter normalen Bedingungen, aber wenn jemand vorzeitig, trifft das rote X in der GUI, das Programm komplett vorhanden (code = 0) und der Haupt-thread der finally-block nicht aufgerufen.
In der Tat, ich will das Programm beenden nach einem Klick auf das rote X, was ich aber nicht wollen, ist ein überspringen des finally {} - block! Ich Sortiere von darlegte in den wichtigsten Teil der finally-block manuell in der GUI, aber ich weiß wirklich nicht wollen, es zu tun auf diese Weise, da ich möchte das GUI entkoppelt vom eigentlichen Programm:
class GUI { //...
...
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
try {
processObject.getIndicatorFileStream().close();
} catch (Exception ignore) {}
System.exit(0);
}
});
...
}
Aber ich würde es vorziehen, um einfach nur ein Aufruf wie dieser:
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Und stellen Sie sicher, dass alle endlich {} - blocks aufgerufen werden, aus jedem thread, der nach der Ausfahrt.
Ich weiß, das ist eigentlich erwartet. Wenn die Anwendung geschlossen wird von einem separaten thread (also der GUI-thread), dann wird der Haupt-thread wird nur zu stoppen in Ihren tracks.
In kurz-wie kann ich sicherstellen, dass eine System.beenden(0) oder ein JFrame.EXIT_ON_CLOSE werden immer noch bewirken, dass jeder thread der finally-block ausgeführt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie keine andere design-Entscheidungen ändern Sie dann, was Sie möglicherweise brauchen, ist ein JVM shutdown-hook, die Hinzugefügt werden können, um führen Sie ein Stück code, wenn
System.exit
genannt wird.Können Sie einen shutdown-hook wie hier erwähnt:
Lesen Sie mehr über shutdown-hooks hier:
http://java.dzone.com/articles/know-jvm-series-2-shutdown
Wort der Vorsicht:
Wenn du zufällig noch solche threads, die rechtlich kann gestoppt werden, zu jeder Zeit, an jedem beliebigen Punkt innerhalb Ihrer Schleife an beliebiger Stelle innerhalb einer Methode, die Sie aufrufen, und kann ich Sie warnen, dass es ist sehr unwahrscheinlich, dass Sie das tun, dann können Sie
stop
alle von Ihnen auf Programm beenden. Dadurch wird eine Ausnahme ausgelöst wird, in jedem thread, und diefinally
Blöcke ausgeführt wird.Jedoch, den richtigen Weg, Ihr Ziel zu erreichen und GUI entkoppelt von der Logik, ist eine einzige "exit" - signal von der GUI, die trigger alle die Anwendung cleanup, das ist geschrieben in einem ganz anderen Klasse. Wenn Sie laufen haben, threads, dann implementieren die
interrupt
Mechanismus in jedem von Ihnen.Gibt es viele Möglichkeiten, um zu erreichen das Ausfahrt-Signalisierung. Zum Beispiel, Ihre business-code registrieren konnte ein GUI-listener für ein besonderes Ereignis, das auslösen der Bereinigung. Sie könnte auch einen thread, der gar nichts anderes tun, aber
await
auf eineCountDownLatch
wärecountDown
von der GUI.Bitte, nicht um jeden Preis verwenden Sie einen shutdown-hook. Dies ist der schmutzigsten Mechanismus vorstellen kann, und es gibt es nur als letzten Ausweg, wenn alle regulären cleanup-Verfahren fehlschlagen. Es ist nie verwendet werden, als Teil des regulären shutdown-routine.
Zusammenfassend, es gibt keinen Königsweg zum sauberen Herunterfahren der Anwendung. Sie implementieren müssen, die spezifische Mechanismen für jede spezifische Anliegen.
CountDownLatch
ist eine andere;AWT custom event
ist ein Dritter.Mit modernen Java
Window.dispose()
auf allen application windows mehr bieten kann anmutig Möglichkeit zum beenden einer AWT-Anwendung alsSystem.exit(0)
finden Sie unterhttps://docs.oracle.com/javase/8/docs/api/java/awt/Window.html#dispose--
und mit Ihrem windows -
Achten Sie jedoch darauf, in widrigen Umgebungen finden Sie unter:
https://docs.oracle.com/javase/8/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown