Ho un'applicazione con una catena Try/Catch/Finally ben definita che esce ed esegue il blocco finally in condizioni normali, ma quando qualcuno premia prematuramente la X rossa nella GUI, il programma esiste completamente (codice = 0) e il blocco finale del thread principale non viene chiamato.Uscire un'applicazione con garbo?
Infatti, voglio che il programma esca con un clic del rosso-X, ma quello che non voglio è un salto del blocco finale {}! I sorta di messo nella parte più importante del blocco finally manualmente nella GUI, ma davvero non voglio farlo in questo modo perché voglio la GUI disaccoppiato dal programma vero e proprio:
class GUI { // ...
...
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
try {
processObject.getIndicatorFileStream().close();
} catch (Exception ignore) {}
System.exit(0);
}
});
...
}
ma mi piacerebbe preferiscono avere solo una chiamata in questo modo:
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
E assicurarsi che tutte le finally {} blocchi vengono chiamati da ogni thread dopo l'uscita.
So che questo è effettivamente previsto. Se l'applicazione viene chiusa da un thread separato (ad esempio il thread della GUI), il thread principale si fermerà semplicemente nelle sue tracce.
In breve, come faccio a garantire che un System.exit (0) o un JFrame.EXIT_ON_CLOSE causi ancora l'esecuzione definitiva di ogni blocco del thread?
Probabilmente importante notare che questo non è garantito per essere sempre eseguito (ad es. quando il jvm si arresta). – DannyMo
@damo Sì, è un punto importante. Lasciatemi aggiungere alla risposta –
Questo è un cattivo consiglio. I ganci di spegnimento dovrebbero ** mai ** essere usati come parte della normale routine di uscita. Sono solo una disposizione di ultima istanza, quando tutto il resto fallisce, per salvare ciò che può essere salvato. –