2009-05-27 10 views
24

Ho un'applicazione in java, in cui cerco di far sì che se qualcuno esca codici System.exit() nel codice, un listener dovrebbe essere chiamato per fare alcune cose come il messaggio di registrazione e il rilascio delle risorse ...Come acquisire l'evento System.exit?

Come posso implementarlo, qualsiasi suggerimento/approccio è benvenuto.

risposta

50

Il metodo Runtime.addShutdownHook può essere utilizzato per aggiungere un gancio di arresto, che è fondamentalmente un Thread non avviato, che viene eseguito all'arresto della Java Virtual Machine.

Tuttavia, questo è un territorio che deve essere seguito con attenzione, poiché viene eseguito in un momento molto delicato del ciclo di vita della JVM. Dalle specifiche API per il metodo Runtime.addShutdownHook: porta

arresto eseguiti in un momento delicato nel ciclo di vita di una macchina virtuale e devono quindi essere codificati difensiva. Dovrebbero, in particolare, scrivere per essere protetto da threading e per evitare i blocchi bloccati nella misura del possibile.

In ogni caso, assicurarsi di leggere un po 'su come funzionano gli hook di arresto, poiché probabilmente non dovrebbero essere affrontati senza una buona preparazione. Assicurati di leggere attentamente le Specifiche API per il metodo Runtime.addShutdownHook.

Ecco sono un paio di articoli che ho trovato da ricerca di informazioni per questa risposta:

  • Shutdown Hooks - mostra un piccolo esempio di come si aggiunge un gancio di arresto per l'accesso allo spegnimento.

  • Design of the Shutdown Hooks API - affronta alcune decisioni di progettazione dei ganci di arresto in uno stile di domande e risposte.

5

La funzione Runtime.addShutdownHook(Thread thehook) consente di registrare un hook nella Java Virtual Machine.
L'hook funziona come un thread inizializzato ma non avviato, che verrà chiamato dalla JVM in uscita. Se si registra più di un hook, si noti che l'ordine in cui vengono chiamati i hook non è definito.