¿Qué pasa si mi programa Java finaliza de forma inesperada? o ¿Cómo puedo realizar una serie de operaciones al finalizar un programa Java? Es my normal que nos hagamos estas preguntas si nos preocupa que el programa Java se cierre y nos deje las conexiones a la base de datos abiertas o puertos de sockets colgados.
Para poder solucionar esta situación podemos realizar una serie de operaciones y así finalizar un programa Java de forma correcta.
La idea es añadir un hook en el cual codificaremos las sentencias que queramos que se ejecuten al finalizar el programa.
Es importante saber que esto solo controla si se ha ejecutado la última línea de un programa o ante un
System.exit()
o en un cierre controlado de la JVM. No funcionará si el sistema operativo mata el proceso.
Para poder añadir el hook utilizamos el método .addShutdownHook()
. Dicho método recibirá un objeto Thread
. Este será el hilo que se ejecute al finalizar el programa.
Runtime.getRuntime().addShutdownHook(new Thread() {...} );
Vemos que el método .addShutdownHook()
se ejecuta sobre el entorno en el que estemos ejecutando nuestro programa Java. Es por ello que utilizamos el objeto Runtime
.
Lo siguiente será codificado el hilo Thread
, eso nos llevará a codificar su método .run()
que será el que tenga el contenido de ejecución del hilo.
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Esto lo ejecutamos cuando acabe el programa");
}
} );
Ya solo nos queda añadir este hook dentro de un método de nuestro programa principal.
public void attachShutDownHook(){
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Esto lo ejecutamos cuando acabe el programa");
}
} );
System.out.println("Creado el hook en el programa");
}
E invocar al método desde el programa. Para añadir el hook y que este se ejecute a finalizar un programa Java.
public static void main(String[] args) {
CierreAplicacion app = new CierreAplicacion();
app.attachShutDownHook();
System.out.println("Última instrucción del programa");
System.exit(0);
}