El hilo del demonio es un hilo de baja prioridad (en el contexto de la JVM) que se ejecuta en segundo plano para realizar tareas como la recogida de basura (gc), etc., no impiden que la JVM salga (aunque el propio hilo del demonio se esté ejecutando) cuando todos los hilos de usuario (hilos no demoníacos) terminan su ejecución. La JVM se termina a sí misma cuando todos los hilos de usuario (hilos no demoníacos) terminan su ejecución, a la JVM no le importa si el hilo demoníaco se está ejecutando o no, si la JVM encuentra un hilo demoníaco en ejecución (al terminar los hilos de usuario), termina el hilo y después de eso se apaga ella misma.
Propiedades de los hilos del demonio:
- Un hilo recién creado hereda el estado de demonio de su padre. Esa es la razón por la que todos los hilos creados dentro del método principal (hilos hijos del hilo principal) son no-demonio por defecto, porque el hilo principal es no-demonio. Sin embargo, puedes crear un hilo de usuario para el demonio utilizando el método setDaemon() de la clase de hilo.Sólo una nota rápida sobre el hilo principal: Cuando la JVM se inicia, crea un hilo llamado «Principal». Tu programa se ejecutará en este hilo, a menos que tú mismo crees hilos adicionales. Lo primero que hace el hilo «Main» es buscar tu método main de vacío estático (String args[]) e invocarlo. Ese es el punto de entrada de tu programa. Si creas hilos adicionales en el método principal, esos hilos serían los hilos hijos del hilo principal.
- Métodos de la clase Thread que están relacionados con hilos de Daemon:public void setDaemon(estado booleano): Este método se utiliza para crear un hilo de usuario a un hilo Daemon o viceversa. Por ejemplo, si tengo un hilo de usuario t entonces t.setDaemon(true) lo convertiría en un hilo de Daemon. Por otro lado si tengo un hilo de Daemon td entonces al llamar a td.setDaemon(false) lo haría hilo normal(user thread/non-daemon thread).public boolean isDaemon(): Este método se utiliza para comprobar el estado de un hilo. Devuelve true si el hilo es Daemon, si no, devuelve false.
- El método setDaemon() sólo puede ser llamado antes de iniciar el hilo. Este método lanzaría IllegalThreadStateException si se llama a este método después del método Thread.start(). (ver el ejemplo)
Ejemplos de hilos de demonio
Ejemplo 1: DaemonThreadExample1.java
Este ejemplo es para demostrar el uso de los métodos setDaemon() e isDaemon().
La clase pública DaemonThreadExample1 extiende el hilo{ public void run(){ // Comprobando si el hilo es Daemon o no si(Thread.currentThread().isDaemon()){ System.out.println("Daemon thread executing"); } else{ System.out.println("user(normal) thread executing"); } } public static void main(String[] args){ /* Creación de dos hilos: por defecto son *hilos de usuario (hilos no demoníacos) */ DaemonThreadExample1 t1=nuevo DaemonThreadExample1(); DaemonThreadExample1 t2=nuevo DaemonThreadExample1(); //Making user thread t1 to Daemon t1.setDaemon(true); //iniciando ambos hilos t1.start(); t2.start(); } }
Salida:
Hilo de demonio ejecutándose-usuario (normal) hilo ejecutándose
Ejemplo 2: DaemonThreadEx2.java
Si llamas al método setDaemon() después de iniciar el hilo (método start()), lanzaría IllegalThreadStateException. Esto significa claramente que puedes llamar al método setDaemon() sólo antes de iniciar un hilo.
public class DaemonThreadEx2 extiende el hilo { public void run(){ System.out.println("El hilo se está ejecutando"); } public static void main(String[] args){ DaemonThreadEx2 t1=new DaemonThreadEx2(); t1.start(); // Lanzará IllegalThreadStateException t1.setDaemon(true); } }
Salida:
Excepción en el hilo "principal" El hilo está ejecutandojava.lang.IllegalThreadStateException en java.lang.Thread.setDaemon(Fuente desconocida) en beginnersbook.com.DaemonThreadEx2.main(DaemonThreadEx2.java:13)
Diferencia entre los hilos Daemon y los que no lo son (hilo de usuario)
La principal diferencia entre el hilo del Demonio y los hilos de usuario es que la JVM no espera el hilo del Demonio antes de salir mientras espera los hilos de usuario, no sale hasta que todos los hilos de usuario terminan su ejecución.