Pregunta ¿Qué es un hilo daemon en Java?


¿Alguien puede decirme qué son los hilos daemon en Java?


635
2018-02-06 14:08


origen


Respuestas:


Un subproceso de daemon es un subproceso que no impide que la JVM salga cuando el programa finaliza pero el subproceso aún se está ejecutando. Un ejemplo para un hilo daemon es la recolección de basura.

Puedes usar el setDaemon(boolean) método para cambiar el Thread propiedades daemon antes de que comience el hilo.


535
2018-02-06 14:10



Algunos puntos más (Referencia: Concurrencia de Java en la práctica)

  • Cuando se crea un nuevo hilo, hereda el estado del daemon de su padre.
  • Los hilos normales de hilo y daemon difieren en lo que sucede cuando ellos salen Cuando la JVM detiene cualquier resto daemon hilos son abandonado:

    • finalmente los bloques no se ejecutan,
    • las pilas no se desenrollan; la JVM acaba de salir.

    Debido a esta razón hilos daemon debe usarse con moderación y es peligroso usarlos para tareas que podría realizar cualquier tipo de E / S.


296
2018-02-06 14:41



Todas las respuestas anteriores son buenas. Aquí hay un pequeño fragmento de código simple para ilustrar la diferencia. Pruébalo con cada uno de los valores de verdadero y falso en setDaemon.

public class DaemonTest {

    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // handle here exception
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {

    public WorkerThread() {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread terminates.
        setDaemon(true); 
    }

    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}

152
2018-03-09 00:54



Tradicionalmente, los procesos daemon en UNIX eran los que se ejecutaban constantemente en segundo plano, al igual que los servicios en Windows.

Un hilo daemon en Java es uno que no evita que la JVM salga. Específicamente, la JVM saldrá cuando solo queden hilos daemon. Usted crea uno llamando al setDaemon() método en Thread.

Leer de Daemon hilos.


91
2018-02-06 14:11



Los hilos Daemon 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á.

Por ejemplo, el navegador HotJava utiliza hasta cuatro subprocesos de daemon denominados "Obtención de imágenes" para buscar imágenes del sistema de archivos o de la red en busca de cualquier subproceso que necesite una.

Los subprocesos Daemon normalmente se utilizan para realizar servicios para su aplicación / applet (como cargar los "bits fiddley"). La diferencia principal entre los subprocesos de usuario y los subprocesos de daemon es que la JVM solo cerrará un programa cuando todos los subprocesos de usuario hayan finalizado. La JVM finaliza los subprocesos Daemon cuando ya no hay subprocesos de usuario en ejecución, incluido el subproceso principal de ejecución.

setDaemon (verdadero / falso)? Este método se usa para especificar que un hilo es un hilo daemon.

public boolean isDaemon ()? Este método se usa para determinar si el hilo es un hilo daemon o no.

P.ej:

public class DaemonThread extends Thread {
    public void run() {
        System.out.println("Entering run method");

        try {
            System.out.println("In run Method: currentThread() is" + Thread.currentThread());

            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException x) {}

                System.out.println("In run method: woke up again");
            }
        } finally {
            System.out.println("Leaving run Method");
        }
    }
    public static void main(String[] args) {
        System.out.println("Entering main Method");

        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException x) {}

        System.out.println("Leaving main method");
    }

}

Salida:

C:\java\thread>javac DaemonThread.java

C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method

C:\j2se6\thread>

52
2018-05-11 06:50



UN hilo daemon es un hilo que se considera realizar algunas tareas en segundo plano, como solicitudes de manejo o varias cronhobs que pueden existir en una aplicación.

Cuando su programa solo tiene hilos daemon restante saldrá. Esto se debe a que generalmente estos subprocesos funcionan junto con subprocesos normales y brindan manejo de eventos en segundo plano.

Puede especificar que un Thread es un demonio uno mediante el uso setDaemon método, por lo general no salen, ni se interrumpen ... simplemente se detienen cuando se detiene la aplicación.


31
2018-02-06 14:12



¿Qué es el hilo Daemon en Java?

  • Los subprocesos Daemon pueden cerrarse en cualquier momento entre su flujo, Non-Daemon, es decir, el subproceso del usuario se ejecuta por completo.
  • Daemon threads se ejecuta con baja prioridad.
  • Los subprocesos de Daemon son subprocesos que se ejecutan intermitentemente en segundo plano siempre que se estén ejecutando otros subprocesos no-demonio.
  • Cuando se completan todos los subprocesos no daemon, los subprocesos daemon terminan automáticamente.
  • Los subprocesos Daemon son proveedores de servicios para subprocesos de usuario que se ejecutan en el mismo proceso.
  • A la JVM no le importan los subprocesos de daemon para completar cuando está en estado En ejecución, ni siquiera finalmente bloquea, también permite su ejecución. JVM da preferencia a los subprocesos no daemon creados por nosotros.
  • Daemon threads actúa como servicios en Windows.
  • La JVM detiene los subprocesos de daemon cuando todos los subprocesos de usuario (a diferencia de los subprocesos de daemon) finalizan. Por lo tanto, los subprocesos de daemon se pueden usar para implementar, por ejemplo, una funcionalidad de supervisión, ya que el subproceso se detiene por la JVM tan pronto como todos los subprocesos de usuario se detienen.

19
2017-07-24 06:07



Un concepto erróneo que me gustaría aclarar:

  • Supongamos que si el hilo daemon (digamos B) se crea dentro del hilo del usuario (por ejemplo, UN); entonces el final de este subproceso / subproceso principal (A) no terminará el hilo de daemon / hilo hijo (B) que ha creado; el hilo de usuario provisto es el único uno actualmente en ejecución.
  • Entonces no hay una relación padre-hijo en el final del hilo. Todos los subprocesos de daemon (independientemente de dónde se creen) finalizarán una vez que no haya un solo subproceso de usuario en vivo y que provoque la terminación de JVM.
  • Incluso esto es cierto para ambos (padre / hijo) son hilos daemon.
  • Si un subproceso secundario creado a partir de un subproceso demonio, entonces también es un subproceso de daemon. Esto no necesitará ninguna configuración explícita del indicador de hilo daemon. De forma similar, si un subproceso secundario creado a partir de un subproceso de usuario también es un subproceso de usuario, si desea cambiarlo, se necesita la configuración del distintivo de demonio explícito antes del inicio de ese subproceso secundario.

15
2017-12-01 13:14



Java tiene un tipo especial de hilo llamado demonio hilo.

  • Muy baja prioridad.
  • Solo se ejecuta cuando no se está ejecutando ninguna otra cadena del mismo programa.
  • JVM finaliza el programa terminando estos subprocesos, cuando los subprocesos de daemon son los únicos hilos que se ejecutan en un programa.

¿Para qué se usan los hilos daemon?

Normalmente se utilizan como proveedores de servicios para hilos normales. Generalmente tiene un ciclo infinito que espera la solicitud de servicio o realiza las tareas del hilo. No pueden hacer trabajos importantes. (Porque no sabemos cuándo tendrán tiempo de CPU y pueden finalizar en cualquier momento si no hay otros subprocesos en ejecución).

Un ejemplo típico de este tipo de hilos es el Recolector de basura de Java.

Hay más...

  • Solo llamas al setDaemon() método antes de llamar al start()método. Una vez que el hilo se está ejecutando, no puede modificar su estado de daemon.
  • Utilizar isDaemon() método para verificar si un hilo es un hilo daemon o un hilo de usuario.

13
2017-08-25 12:19