System.exit()
se puede utilizar para ejecutar shutdown hooks antes de que el programa se cierre. Esta es una forma conveniente de manejar el apagado en programas más grandes, donde todas las partes del programa no pueden (y no deberían) estar conscientes el uno del otro. Luego, si alguien quiere abandonar, simplemente puede llamar al System.exit()
, y los ganchos de apagado (si están configurados correctamente) se encargan de todas las ceremonias de cierre necesarias, como cerrar archivos, liberar recursos, etc.
"Este método nunca regresa normalmente." significa simplemente que el método no volverá; una vez que un hilo va allí, no volverá.
Otra forma, tal vez más común, de salir de un programa es simplemente llegar al final del método main
. Pero si hay algún subproceso que no sea demonio en ejecución, no se cerrarán y, por lo tanto, la JVM no se cerrará. Por lo tanto, si tiene algún tipo de subprocesos no daemon, necesita algunos otros medios (que los ganchos de apagado) para cerrar todos los subprocesos no daemon y liberar otros recursos. Si no hay otros subprocesos que no sean daemon, al volver del main
se cerrará la JVM y se llamarán a los ganchos de apagado.
Por alguna razón, los ganchos de cierre parecen ser un mecanismo infravalorado y mal entendido, y la gente está reinventando la rueda con todo tipo de ataques personalizados patentados para abandonar sus programas. Yo recomendaría usar ganchos de apagado; está todo allí en el estándar Runtime que usará de todos modos. Se necesita
"Este método nunca vuelve normalmente". significa simplemente que el método no volverá; una vez que un hilo va allí, no volverá. Tenga en cuenta en particular que esto significa que no puede probar la unidad de un método que hace que una llamada System.exit (0) ... –
-1 Incorrecto. Los ganchos de cierre se ejecutarán si la JVM finaliza normalmente, sin importar si es debido a System.exit o la terminación de main(). Ver http: //zx81/doku/java/javadoc/j2se1.5.0/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29 – sleske
@sleske: La terminación de main() no es suficiente si hay otros hilos no-daemon alrededor. El apagado se inicia solo después de que finaliza el último subproceso no daemon, a menos que llame explícitamente a System.exit(). Eso está claramente establecido en la documentación de Runtime. –