2012-04-24 16 views
6

Hace poco se hizo una pregunta:Diferencia entre un hilo de utilidad y un hilo de baja prioridad

Tenemos el método setPriority() para establecer un hilo de baja prioridad. Entonces, ¿por qué necesitamos un hilo de daemon? ¿Cual es la diferencia entre ellos?

¿Marcar un hilo como daemon cambia su programación?

+3

¿De qué idioma estamos hablando aquí? – Gray

+2

.. y qué OS ?? –

+0

Recuerde aceptar mi respuesta si es útil. – Gray

Respuesta

14

Tenemos el método setPriority() para establecer un hilo de baja prioridad. Entonces, ¿por qué necesitamos un hilo daemon? ¿Cual es la diferencia entre ellos?

Normalmente, los hilos daemon no tienen nada que ver con la prioridad. En Java, por ejemplo, la JVM se apaga cuando finalizan todos los subprocesos no daemon del usuario. Marcar un hilo como un hilo daemon significa que se puede matar de forma segura cuando se cierra el JVM.

La prioridad se trata de la programación: acerca de con qué frecuencia un subproceso obtiene un segmento de tiempo en comparación con otros subprocesos que están listos para ejecutarse. Puede tener subprocesos daemon de baja prioridad o subprocesos daemon de alta prioridad. Puede tener subprocesos no daemon que también son de baja y alta prioridad.

Los conceptos son ortogonales (mutuamente independientes), al menos en el modelo de subproceso de Java.

En términos de cuándo crear un daemon de subprocesos, uso subprocesos de daemon para cualquier tarea que no me importa si se interrumpen cuando se cierra la JVM: hilos de keep-alive, procesadores de estadísticas, manejo de registro, etc. Todo lo que es crítico para la aplicación es un hilo que no es demonio que debe ser interrumpido o señalado específicamente para que se cierre de alguna manera.

+0

Gracias Gray. Entonces, ¿de qué sirve crear un hilo (en java) y convertirlo en un hilo daemon? ¿Hay algún escenario práctico donde lo usemos? – Ash

+1

Uso daemon threads para cualquier cosa que no me importe si se interrumpe cuando sale la JVM: hilos de keep-alive, procesadores de estadísticas, manejo de registros, etc. Todo lo que es crítico para la aplicación no es daemon. – Gray

1

Un hilo de daemon en ejecución no evitará que su programa finalice/salga. Sin embargo, todos los subprocesos de usuario deben finalizar antes de que su programa pueda salir. La prioridad puede aplicarse a cualquier daemon o subproceso del usuario. Puede comprender priority de la misma manera que lo entiende en la vida cotidiana.

0

Si el tiempo de ejecución de Java determina que los únicos subprocesos ejecutados en una aplicación son subprocesos de daemon (es decir, no existen subprocesos de usuario), el tiempo de ejecución de Java cierra rápidamente la aplicación, deteniendo efectivamente todos los subprocesos de daemon muertos. Para que una aplicación continúe ejecutándose, siempre debe tener al menos una cadena de usuario en vivo. En todos los demás aspectos, el tiempo de ejecución de Java trata los hilos de daemon y los hilos de usuario exactamente de la misma manera.

excepto que en el hilo daemon ... cuando JVM termina abruptamente, finalmente no se ejecutan los bloques, las pilas no se desenrollan - JVM acaba de salir. Debido a esta razón, los subprocesos de daemon se deben usar con moderación y es peligroso usarlos para tareas que puedan realizar cualquier tipo de E/S.

0

Un ejemplo de

  1. JVM cuando el cierre de hilo de baja prioridad completa.A pesar de hilos Daemon aún en marcha
  2. ADEMÁS, muestra que el hilo creado por un hilo daemon se convierte automáticamente en un hilo daemon

    package junk.daemon_thread_example; 
    
    class DeamonThreadPlus implements Runnable{ 
        String id; 
        boolean createChild; 
    
        public DeamonThreadPlus(String id, boolean createChild){ 
         this.id = id; 
         this.createChild = createChild; 
        } 
    
        @Override 
        public void run() { 
         // Parent daemon thread creates child daemon thread by default 
         if (createChild) 
          new Thread(new DeamonThreadPlus("DaemonChild", false)).start(); 
    
         // This thread never self-completes (only terminates when process dies) 
         while (true){ 
          try { 
           Thread.sleep(1); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
          System.out.println("Daemon " 
            + Thread.currentThread().isDaemon() 
            + " id = " + id); 
          } 
        } 
    } 
    
    class UThread implements Runnable{ 
    
        @Override 
        public void run() { 
         System.out.println("User thread start"); 
         try { 
          Thread.sleep(5); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         System.out.println("User thread end (program exits)"); 
        } 
    } 
    
    public class Caller{ 
    
        public static void main(String[] args) { 
         Thread dt = new Thread(new DeamonThreadPlus("Daemon", true)); 
         dt.setDaemon(true); 
         dt.start(); 
    
         Thread ut = new Thread(new UThread()); 
         ut.setPriority(Thread.MIN_PRIORITY); 
         ut.start(); 
        } 
    
    } 
    

    La salida es: hilo usuario inicia
    Daemon verdadera id = Daemon
    Daemon verdadera id = DaemonChild
    Daemon verdadera id = Daemon
    Daemon verdadera id = DaemonChild
    Daemon verdadera id = Daemon
    Daemon verdadera id = DaemonChild
    Daemon verdadera id = Daemon
    Daemon verdadera id = DaemonChild
    extremo del hilo de usuario (programa sale)
    Daemon verdadera id = DaemonChild
    Daemon verdadera id = Daemon

Cuestiones relacionadas