Ich habe eine Probelem. Ich kann meine Software nicht beenden :-(
Über ein Menü führe ich folgende Aktion aus:
Code:
MenuItem mExit = new MenuItem("Beenden");
mExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
stop();
Logout();
System.exit(0);
}
});
Die Funktionen stop() und Logout() laufen perfekt, anschließend rufe ich System.exit(0) auf. Nur leider werden nicht alle Threads beendet. Sondern anschließend laufen einige Threads weiter. Ich kann mir das nicht erklären.
Ich habe zusätzlich einen ShutDownHook implementiert, der auch ausgeführt wird beim System.exit(0) auch in diesem mache ich nochmal System.exit(0).
Normalerweise sollte die VM sauber beenden, in dem alle nicht-deamon Threads sauber beendet werden. Aber wie gesagt, bei GUIs sehe ich keine andere Lösung als mit System.exit(0); die Applikation zu beenden.
wenn man sich sein eigenes kleines progrämmchen zusammenfrickelt, kann es einem wahrscheinlich egal sein. aber sobald die möglichkeit besteht, dass fremde den code wiederverwenden, ist das harte beenden der VM eines der schlimmsten dinge, die man tun kann.
wenn ich fremden code verwende, dann erwarte ich, dass er anständig terminiert, oder zumindest "nur tote threads" hinterlässt. aber wenn mir so ein stück code die VM unterm arsch wegreisst, bin ich ziemlich aufgeschmissen.
na die Begründung ist ja ziemlich minderwertig,
genauso erwarte ich von jeder Bibliothek (z.B. Math.max()), dass nicht auf einmal ein Sound abgespielt, eine Log-Datei geschrieben, ein JFrame oder eine Internet-Connection geöffnet wird usw
die Liste ist endlos, da ist System.exit() ja nur zufällig eines von tausenden Dingen
wenn man sich sein eigenes kleines progrämmchen zusammenfrickelt, kann es einem wahrscheinlich egal sein. aber sobald die möglichkeit besteht, dass fremde den code wiederverwenden, ist das harte beenden der VM eines der schlimmsten dinge, die man tun kann.
wenn ich fremden code verwende, dann erwarte ich, dass er anständig terminiert, oder zumindest "nur tote threads" hinterlässt. aber wenn mir so ein stück code die VM unterm arsch wegreisst, bin ich ziemlich aufgeschmissen.
Jeder "anständig geschriebene Code" darf das System auf keinen Fall dauerhaft negativ beeinflussen (z.B. eine Datenbank zerstören), wenn er ohne Ankündigung terminiert wird. Andernfalls ist über die Zeit durch Crashes, Ausschalten etc. *gegeben*, dass der Code das System selbst kaputt macht.
Wenn ohnehin jeder Code sich bei plötzlichem zwangsweisen Beenden so Verhalten muss, dass das System nicht beeinträchtigt wird, kann ich das genau so gut auch regelmäßig tun.
Jeder "anständig geschriebene Code" darf das System auf keinen Fall dauerhaft negativ beeinflussen (z.B. eine Datenbank zerstören), wenn er ohne Ankündigung terminiert wird. Andernfalls ist über die Zeit durch Crashes, Ausschalten etc. *gegeben*, dass der Code das System selbst kaputt macht.
wäre schön, aber das ist eine anforderung, die nicht erfüllt werden kann. jede atomare transaktion benötigt eine zeitspanne, um vollständig ausgeführt zu werden. wenn du den prozess hart beendest, kann nicht garantiert werden, dass das system in einem gültigen zustand hinterlassen wird. man kann die gefahr reduzieren, aber niemals ganz eliminieren.