Enterarse de que la máquina virtual de Java termina

De ChuWiki
Saltar a: navegación, buscar
  • La función Runtime.getRuntime().addShutdownHook(Thread hook) ejecuta unThread antes de que la JVM finalice.
  • Unas notas:
    • Debemos asegurarnos de que el codigo que escribimos es thread-safe
    • Si se han añadido varios shutdown hook no hay garantias sobre cual se lanza antes y siempre hay que tener presente que serán concurrentes
    • Un uso típico es vaciar bufferes y cerrar ficheros, especialmente ante una caida de la JVM.
      • Muy útil para recoger esas excepciones que hacen caer la máquina virtual y nunca llegan a registrarse en el fichero de traza
    • La JVM lo invoca siempre, desde un simple System.exit(0) hasta la aparición de una RuntimeException.


import java.io.*;


public class ShutdownDemo
{

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main( String args[] ) throws IOException
	{

		Thread shutdownThread = new Thread()
		{
			public void run( )
			{
				// Aqui se pone el código que queremos:
				// es util hacer cosas como cerrar ficheros, sockets, etc.
				System.out
					.println( "Esto se imprimirá antes de que la maquina virtual finalice" );
			}
		};

		Runtime.getRuntime().addShutdownHook( shutdownThread );

		// Si por ejemplo se produjese una excepción de este tipo
		// se ejecutará el thread antes de que la máquina virtual finalice:
		throw new RuntimeException();
		//También se nos notificaría si la aplicación sale con un exit:
		System.exit(0);

	}
}