¿Qué es un hilo de demonio en Java?

Resuelto rocker asked hace 14 años • 0 respuestas

¿Alguien puede decirme qué subprocesos de demonio hay en Java?

rocker avatar Feb 06 '10 21:02 rocker
Aceptado

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

Puede utilizar el setDaemon(boolean)método para cambiar las Threadpropiedades del demonio antes de que comience el hilo.

b_erb avatar Feb 06 '2010 14:02 b_erb

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

  • Cuando se crea un nuevo hilo, hereda el estado de demonio de su padre.
  • Cuando finalizan todos los subprocesos que no son demonios, la JVM se detiene y los subprocesos demonios restantes se abandonan :

    • finalmente los bloques no se ejecutan ,
    • las pilas no se desenrollan: la JVM simplemente sale.

    Debido a esta razón, los subprocesos del demonio deben usarse con moderación y es peligroso usarlos para tareas que puedan realizar cualquier tipo de E/S.

sateesh avatar Feb 06 '2010 14:02 sateesh

Todas las respuestas anteriores son buenas. Aquí hay un pequeño fragmento de código simple para ilustrar la diferencia. Pruébelo 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 non daemon thread),
        // the WorkerThread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the WorkerThread terminates when the main 
        // thread or/and user defined thread(non daemon) 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
            }
        }
    }
}
russ avatar Mar 09 '2012 00:03 russ

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

Un hilo de demonio en Java es aquel que no impide que la JVM salga. Específicamente, la JVM se cerrará cuando solo queden subprocesos de demonio. Crea uno llamando al setDaemon()método en Thread.

Lea los hilos de Daemon .

cletus avatar Feb 06 '2010 14:02 cletus

Los subprocesos del demonio son como proveedores de servicios para otros subprocesos u objetos que se ejecutan en el mismo proceso que el subproceso del demonio. Los subprocesos de demonio se utilizan para tareas de soporte en segundo plano y solo son necesarios mientras se ejecutan subprocesos normales. Si los subprocesos normales no se están ejecutando y los subprocesos restantes son subprocesos de demonio, entonces el intérprete sale.

Por ejemplo, el navegador HotJava utiliza hasta cuatro subprocesos demonio llamados "Image Fetcher" para recuperar imágenes del sistema de archivos o la red para cualquier subproceso que lo necesite.

Los subprocesos de demonio se utilizan normalmente 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 demonio es que la JVM solo cerrará un programa cuando todos los subprocesos de usuario hayan terminado. La JVM finaliza los subprocesos del demonio cuando ya no hay subprocesos de usuario en ejecución, incluido el subproceso principal de ejecución.

setDaemon(verdadero/falso)? Este método se utiliza para especificar que un hilo es un hilo de demonio.

público booleano isDaemon()? Este método se utiliza para determinar si el subproceso es un subproceso demonio 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");
    }

}

Producción:

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>
Okky avatar May 11 '2012 06:05 Okky