Hilo de demonio en Java

El subproceso Daemon en Java es un subproceso de baja prioridad que se ejecuta en segundo plano para realizar tareas como la recolección de elementos no utilizados. El subproceso Daemon en Java también es un subproceso de proveedor de servicios que brinda servicios al subproceso del usuario. Su vida depende de la misericordia de los subprocesos de usuario, es decir, cuando todos los subprocesos de usuario mueren, JVM finaliza este subproceso automáticamente.

En palabras simples, podemos decir que brinda servicios a los subprocesos de usuario para tareas de soporte en segundo plano. No tiene ningún papel en la vida que no sea servir hilos de usuario.

Ejemplo de Daemon Thread en Java: recolección de basura en Java (gc), finalizador, etc.

Propiedades del subproceso Java Daemon

  • No pueden evitar que la JVM salga cuando todos los subprocesos de usuario finalizan su ejecución.
  • JVM finaliza cuando todos los subprocesos de usuario finalizan su ejecución.
  • Si JVM encuentra un subproceso de daemon en ejecución, finaliza el subproceso y, después de eso, lo apaga. A JVM no le importa si el subproceso Daemon se está ejecutando o no.
  • Es un hilo de máxima prioridad baja.

Naturaleza predeterminada del subproceso Daemon

De forma predeterminada, el subproceso principal siempre no es un demonio, pero para todos los subprocesos restantes, la naturaleza del demonio se heredará de padre a hijo. Es decir, si el padre es Daemon, el hijo también es Daemon y si el padre no es daemon, entonces el hijo tampoco es daemon.

Nota: Siempre que finalice el último subproceso que no sea daemon, todos los subprocesos daemon finalizarán automáticamente.

Métodos de Daemon Thread

1. void setDaemon(estado booleano): 

Este método marca el subproceso actual como un subproceso daemon o un subproceso de usuario. Por ejemplo, si tengo un subproceso de usuario tU, entonces tU.setDaemon(true) lo convertiría en un subproceso Daemon. Por otro lado, si tengo un subproceso Daemon tD, llamar a tD.setDaemon (falso) lo convertiría en un subproceso de usuario. 

Sintaxis: 

public final void setDaemon(boolean on)

Parámetros:

  • on: si es verdadero, marca este subproceso como un subproceso daemon.

Excepciones:

  • IllegalThreadStateException : si solo este hilo está activo.
  • SecurityException: si el subproceso actual no puede modificar este subproceso.

2. booleano esDaemon(): 

Este método se utiliza para comprobar que el subproceso actual es un demonio. Devuelve verdadero si el hilo es Daemon. De lo contrario, devuelve falso. 

Sintaxis: 

public final boolean isDaemon()

Devoluciones: 

Este método devuelve verdadero si este subproceso es un subproceso daemon; falso de lo contrario

Java

// Java program to demonstrate the usage of
// setDaemon() and isDaemon() method.
  
public class DaemonThread extends Thread
{
    public DaemonThread(String name){
        super(name);
    }
  
    public void run()
    {
        // Checking whether the thread is Daemon or not
        if(Thread.currentThread().isDaemon())
        {
            System.out.println(getName() + " is Daemon thread");
        }
          
        else
        {
            System.out.println(getName() + " is User thread");
        }
    }
      
    public static void main(String[] args)
    {
      
        DaemonThread t1 = new DaemonThread("t1");
        DaemonThread t2 = new DaemonThread("t2");
        DaemonThread t3 = new DaemonThread("t3");
      
        // Setting user thread t1 to Daemon
        t1.setDaemon(true);
              
        // starting first 2 threads
        t1.start();
        t2.start();
  
        // Setting user thread t3 to Daemon
        t3.setDaemon(true);
        t3.start();        
    }
}

Producción: 

t1 is Daemon thread
t3 is Daemon thread
t2 is User thread

Excepciones en un hilo Daemon 

Si llama al método setDaemon() después de iniciar el subproceso, arrojaría IllegalThreadStateException .

Java

// Java program to demonstrate the usage of
// exception in Daemon() Thread
  
public class DaemonThread extends Thread
{
    public void run()
    {
        System.out.println("Thread name: " + Thread.currentThread().getName());
        System.out.println("Check if its DaemonThread: "
                        + Thread.currentThread().isDaemon());
    }
  
    public static void main(String[] args)
    {
        DaemonThread t1 = new DaemonThread();
        DaemonThread t2 = new DaemonThread();
        t1.start();
          
        // Exception as the thread is already started
        t1.setDaemon(true);
          
        t2.start();
    }
}

Excepción en tiempo de ejecución: 

Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.setDaemon(Thread.java:1352)
    at DaemonThread.main(DaemonThread.java:19)

Producción: 

Thread name: Thread-0
Check if its DaemonThread: false

Esto muestra claramente que no podemos llamar al método setDaemon() después de iniciar el hilo. 

Demonio frente a subprocesos de usuario

  1. Prioridad: cuando los únicos subprocesos restantes en un proceso son subprocesos daemon, el intérprete sale. Esto tiene sentido porque cuando solo quedan subprocesos daemon, no hay otro subproceso para el cual un subproceso daemon pueda proporcionar un servicio.
  2. Uso: El subproceso Daemon es para proporcionar servicios al subproceso de usuario para tareas de soporte en segundo plano.

Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *