Hilos de demonio en Java

1. Información general

En este breve artículo, veremos los subprocesos de demonios en Java y veremos para qué se pueden usar. También explicaremos la diferencia entre los hilos de demonio y los hilos de usuario.

2. Diferencia entre Daemon y User Threads

Java ofrece dos tipos de subprocesos: subprocesos de usuario y subprocesos de demonio.

Los hilos de usuario son hilos de alta prioridad. La JVM esperará a que cualquier hilo de usuario complete su tarea antes de finalizarlo.

Por otro lado, los subprocesos de demonio son subprocesos de baja prioridad cuya única función es proporcionar servicios a los subprocesos de los usuarios.

Dado que los subprocesos del demonio están destinados a servir subprocesos de usuario y solo son necesarios mientras los subprocesos de usuario se están ejecutando, no evitarán que la JVM salga una vez que todos los subprocesos de usuario hayan finalizado su ejecución.

Es por eso que los bucles infinitos, que normalmente existen en los subprocesos del demonio, no causarán problemas, porque ningún código, incluidos los bloques finalmente , no se ejecutará una vez que todos los subprocesos del usuario hayan terminado su ejecución. Por esta razón, no se recomiendan los subprocesos de demonio para tareas de E / S.

Sin embargo, existen excepciones a esta regla. El código mal diseñado en los subprocesos del demonio puede evitar que la JVM salga. Por ejemplo, llamar a Thread.join () en un hilo de demonio en ejecución puede bloquear el cierre de la aplicación.

3. Usos de los subprocesos daemon

Los subprocesos de Daemon son útiles para tareas de apoyo en segundo plano, como la recolección de basura, la liberación de memoria de objetos no utilizados y la eliminación de entradas no deseadas de la caché. La mayoría de los subprocesos de JVM son subprocesos de demonio.

4. Creación de un subproceso de demonio

Para configurar un hilo para que sea un hilo demonio, todo lo que tenemos que hacer es llamar a Thread.setDaemon (). En este ejemplo, usaremos la clase NewThread que extiende la clase Thread :

NewThread daemonThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start();

Cualquier hilo hereda el estado de demonio del hilo que lo creó. Dado que el hilo principal es un hilo de usuario, cualquier hilo que se cree dentro del método principal es por defecto un hilo de usuario.

El método setDaemon () solo se puede llamar después de que se haya creado el objeto Thread y no se haya iniciado el hilo. Un intento de llamar a setDaemon () mientras se está ejecutando un hilo arrojará una IllegalThreadStateException :

@Test(expected = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() { NewThread daemonThread = new NewThread(); daemonThread.start(); daemonThread.setDaemon(true); }

5. Comprobación de si un subproceso es un subproceso daemon

Finalmente, para verificar si un hilo es un hilo demonio, simplemente podemos llamar al método isDaemon () :

@Test public void whenCallIsDaemon_thenCorrect() { NewThread daemonThread = new NewThread(); NewThread userThread = new NewThread(); daemonThread.setDaemon(true); daemonThread.start(); userThread.start(); assertTrue(daemonThread.isDaemon()); assertFalse(userThread.isDaemon()); }

6. Conclusión

En este tutorial rápido, hemos visto qué son los hilos de demonio y para qué se pueden usar en algunos escenarios prácticos.

Como siempre, la versión completa del código está disponible en GitHub.