2009-05-27 18 views
24

Tengo una aplicación en Java, en la que trato de asegurarme de que si alguien sale de los códigos System.exit() en el código, se debe llamar a un oyente para que haga algunas cosas, como registrar un mensaje y liberar los recursos ...Cómo capturar el evento System.exit?

¿Cómo puedo implementarlo, cualquier sugerencia/enfoque es bienvenida.

Respuesta

50

El método Runtime.addShutdownHook se puede utilizar para agregar un gancho de apagado, que es básicamente un Thread no iniciado, que se ejecuta al apagar la máquina virtual Java.

Sin embargo, este es un territorio que debe pisarse con cuidado, ya que se realiza en un momento muy delicado del ciclo de vida de la JVM. A partir de las especificaciones API para el método Runtime.addShutdownHook: ganchos

de apagado se ejecutan en un momento delicado en el ciclo de vida de una máquina virtual y por lo tanto debe codificarse defensiva. Deben escribirse, en el en particular, como seguro para subprocesos y para evitar los interbloqueos en la medida de lo posible.

En cualquier caso, asegúrese de leer un poco sobre cómo funcionan los ganchos de desconexión, ya que probablemente no deberían abordarse sin una buena preparación. Asegúrese de leer cuidadosamente la Especificación API para el método Runtime.addShutdownHook.

Aquí hay un par de artículos que encontré de búsqueda de información para esta respuesta:

  • Shutdown Hooks - que muestra un pequeño ejemplo de cómo se añade un gancho de cierre para iniciar la sesión en el apagado.

  • Design of the Shutdown Hooks API - aborda algunas decisiones de diseño de los ganchos de cierre en un estilo de pregunta y respuesta.

5

La función Runtime.addShutdownHook(Thread thehook) le permite registrar un enlace en la máquina virtual Java.
El gancho funciona como un subproceso inicializado pero no iniciado, que será invocado por la JVM al salir. En caso de que registre más de un enganche, tenga en cuenta que el orden en que se llaman los ganchos no está definido.

Cuestiones relacionadas