Atrapar Ctrl+C en Java
command-line control-c (2)
Puede adjuntar un gancho de apagado a la máquina virtual que se ejecuta cada vez que la máquina virtual se apaga:
La máquina virtual de Java se apaga en respuesta a dos tipos de eventos:
El programa sale normalmente, cuando sale el último hilo no daemon o cuando se invoca el método exit (equivalentemente, System.exit), o
La máquina virtual se termina en respuesta a una interrupción del usuario, como escribir Ctrl + C , o un evento de todo el sistema, como el cierre de sesión del usuario o el cierre del sistema.
Sin embargo, el hilo que pasa como gancho de apagado tiene que seguir varias reglas, así que lea la documentación vinculada con cuidado para evitar problemas. Esto incluye garantizar la seguridad del hilo, la rápida terminación del hilo, etc.
Además, como señala el comentarista Jesper, se garantiza que los ganchos de cierre se ejecutarán en el apagado normal de la máquina virtual, pero si el proceso de la máquina virtual se termina por la fuerza, no lo hacen. Esto puede suceder si el código nativo se taskkill /f
o si matas por la fuerza el proceso ( kill -9
, taskkill /f
).
Pero en esos escenarios, todas las apuestas están apagadas de todos modos, por lo que no perdería demasiado en eso.
¿Es posible capturar la señal Ctrl + C en una aplicación de línea de comandos java? Me gustaría limpiar algunos recursos antes de terminar el programa.
Sólo para propósitos de prueba rápida de la consola ...
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
Thread.sleep(200);
System.out.println("Shouting down ...");
//some cleaning up code...
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});