Un hilo de demonio es un hilo en segundo plano de baja prioridad que no impide que la JVM salga cuando el programa finaliza la ejecución.
- Los subprocesos de Daemon se ejecutan en segundo plano para admitir subprocesos de usuario.
- La JVM sale automáticamente cuando se completan todos los subprocesos de usuario (que no son demonios).
- Se crean usando la misma clase Thread pero se marcan como demonio usando el método setDaemon(true).
- Se debe llamar al método setDaemon(true) antes de que comience el hilo.
- Los ejemplos comunes incluyen el recolector de basura y el subproceso finalizador.
Sintaxis
Javathread.setDaemon(true);
Casos de uso
- Recolección de basura: El recolector de basura (GC) en Java se ejecuta como un hilo de demonio.
- Monitoreo de antecedentes: Los subprocesos de Daemon pueden monitorear el estado de los recursos o conexiones de los componentes de la aplicación.
- Servicios de registro y auditoría: Los subprocesos de Daemon se pueden utilizar para registrar actividades en segundo plano de forma continua.
- Operaciones de limpieza: Los subprocesos del demonio pueden borrar periódicamente archivos temporales, liberar recursos no utilizados o realizar una limpieza de caché.
- Tareas del programador o temporizador: Los programadores en segundo plano suelen utilizar subprocesos de demonio para activar tareas a intervalos fijos.
Métodos utilizados
- void setDaemon (booleano activado): Marca un hilo como demonio o hilo de usuario. Debe llamarse antes de iniciar().
- booleano esDaemon(): Comprueba si un hilo es un demonio.
Creando un hilo de demonio
Javapublic class DaemonExample extends Thread { public void run() { if (Thread.currentThread().isDaemon()) { System.out.println('Daemon thread running...'); } else { System.out.println('User thread running...'); } } public static void main(String[] args) { DaemonExample t1 = new DaemonExample(); DaemonExample t2 = new DaemonExample(); t1.setDaemon(true); // must be set before start() t1.start(); t2.start(); } }
Producción
Daemon thread running... User thread running...
Comportamiento del hilo demoníaco
Javapublic class DaemonBehavior extends Thread { public void run() { while (true) { System.out.println('Daemon thread running...'); } } public static void main(String[] args) { DaemonBehavior t = new DaemonBehavior(); t.setDaemon(true); t.start(); System.out.println('Main (user) thread ends...'); } }
Producción
Main (user) thread ends...
La JVM finaliza inmediatamente después de que finaliza el hilo principal, aunque el hilo del demonio todavía se esté ejecutando.
Notas importantes
- Un hilo hereda el estado de demonio del hilo que lo crea.
- El método setDaemon(true) arroja IllegalThreadStateException si se llama después de start().
- Los subprocesos de Daemon no deben usarse para tareas que requieran completarse, como escribir en un archivo o actualizar una base de datos.
- JVM finaliza todos los subprocesos del demonio abruptamente sin realizar operaciones de limpieza.
Diferencia entre hilo de usuario y hilo de demonio
| Base | Hilo de usuario | Hilo demoníaco |
|---|---|---|
| Objetivo | Ejecuta las principales tareas de la aplicación. | Realiza servicios en segundo plano. |
| Ciclo vital | Mantiene viva la JVM hasta que termine | Termina cuando finalizan todos los hilos de usuario. |
| Prioridad | Generalmente más alto | Generalmente más bajo |
| Salir de JVM | JVM espera a que se complete | JVM sale incluso si se está ejecutando |
| Ejemplos | Hilos de trabajo del hilo principal | Monitores de fondo del recolector de basura |