2011-08-15 16 views

Respuesta

43

La JVM sale cuando todos los subprocesos en ejecución son subprocesos de daemon. Imagina que estás escribiendo un juego simple donde tu método principal gira hasta que decides abandonarlo. E imagina que al comienzo del juego, comienzas un hilo que sondeará sin fin un sitio web para activar alertas. Le gustaría que la JVM salga cuando decida finalizar el juego. No querrás que la interminable votación impida que el juego termine. Entonces haces que este hilo de sondeo sea un hilo de daemon.

+0

En su ejemplo, cuando el usuario decide finalizar el juego, ¿bloqueará la JVM si aún hay subprocesos de usuario (y no subprocesos de daemon) en ejecución? – Kal

+0

@Kal: Sí, así es como funciona. Los subprocesos de usuario evitarán que la JVM se cierre. –

+1

Sí: si el método principal simplemente regresa, la JVM seguirá ejecutándose. Por supuesto, si llama a System.exit, dejará de ejecutarse. –

10

La JVM finaliza automáticamente un hilo Deamon cuando finalizan todos los hilos "normales". Los hilos normales nunca terminan automáticamente.

4

Los servicios que desea ofrecer a sus consumidores sin ningún tipo de interacción con el usuario por medio de hilos de usuarios forman el caso de uso primario para establecer un hilo de usuario como daemon.

Como consecuencia, hasta que existan subprocesos de usuario, JVM garantiza que los subprocesos de daemon se ejecutan continuamente. Puedes encontrar ejemplos como GC, UI Thread, etc. esos son daemons.

Espero que ayude.

1

Normalmente, el programa finaliza cuando todos sus subprocesos salieron de su método run(). Los subprocesos Daemon no impiden que el programa finalice, incluso si todavía se están ejecutando, es decir, ejecutando run().

Por lo tanto, debe utilizar el hilo daemon si no desea evitar la finalización del programa cuando el hilo todavía se está ejecutando. Es típico, por ejemplo, para tareas periódicas prolongadas, pero en realidad depende en gran medida de su programa, su diseño y su gusto.

2

Como otros han señalado, un hilo daemon no impide que la JVM salga cuando el programa finaliza cuando este hilo todavía se está ejecutando.

En general, preferiría no crear subprocesos de daemon, a menos que esté absolutamente seguro de que el subproceso no tiene efectos secundarios. Como no se puede saber cuándo se detiene el hilo, no se ejecutan los bloques del finalizador ni se desenrolla ninguna pila. Intente evitar el uso de operaciones de E/S en subprocesos de daemon porque puede dañar los datos.

0

Los usé con Timer para eliminar archivos que no se pueden eliminar de inmediato. Es decir, genero archivos .exe, los ejecuto y luego los elimino. Pero existe un 50% de probabilidad de que executable.delete falle, aparentemente porque la imagen todavía está bloqueada por el proceso en la terminación. Puede eliminar de manera confiable imágenes ejecutables solo después de que el proceso haya finalizado por completo. Pero, nunca se sabe cuánto tiempo lleva. Establece .deleteOnExit en lugar de .delete. Pero no desea esperar hasta que la máquina Java también termine. Puede tomar mucho tiempo y no quiere millones de archivos .exe estúpidos inútiles, que ya no necesita, colgando en el sistema de archivos. Por lo tanto, programe executable.delete en el temporizador para que suceda uno o dos segundos más tarde. Sin embargo, el temporizador no puede ser un hilo habitual. Si es así, impedirá que su programa finalice, incluso si no hay archivos para eliminar. Sin embargo, puedo convertirlo fácilmente en daemon porque no importa si mis archivos son eliminados o no por el temporizador: los archivos se eliminarán de cualquier forma: ya sea por daemon o por java exit. Creo que es un uso perfecto de daemon.

0

Los hilos Daemon en Java son como un proveedor de servicios para otros hilos u objetos que se ejecutan en el mismo proceso que el hilo daemon. Los subprocesos Daemon se utilizan para tareas secundarias de respaldo y solo son necesarios mientras se ejecutan subprocesos normales.Si los hilos normales no se están ejecutando y los hilos restantes son hilos daemon, el intérprete saldrá.

Cuando se crea un nuevo hilo, hereda el estado del demonio de su elemento primario. Los subprocesos normales de subprocesos y demonios difieren en lo que sucede cuando salen. Cuando la JVM detiene cualquier daemon restante, los hilos se abandonan: finalmente no se ejecutan los bloques, las pilas no se desenrollan - JVM acaba de salir. Debido a esta razón, los subprocesos de daemon se deben usar con moderación y es peligroso usarlos para tareas que puedan realizar cualquier tipo de E/S.

+0

intente evitar el uso de operaciones de IO en subprocesos de daemon porque puede dañar datos. –

Cuestiones relacionadas