2012-07-11 9 views
11

cuando pulso ctrl - c en la consola en qué secuencia se detienen hebras de la aplicación y los ganchos de cierre llaman?¿Cómo funciona el CTRL-C con el programa Java

+2

para citar los documentos: [Cuando la máquina virtual comienza su secuencia de apagado iniciará todos los enganches de cierre registrados en algún orden no especificado y los dejará ejecutar simultáneamente. Cuando todos los enganches hayan finalizado, se ejecutarán todos los finalizadores no invocados si se ha habilitado la finalización a la salida.] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) por lo tanto, podemos reunir ganchos de cierre siempre se llama primero independientemente, lo que tiene sentido o lo que sería el punto de tal gancho si los hilos se cierran primero? Para decirle a un usuario que sus datos se han ido –

Respuesta

8

De acuerdo con los javadocs, los ganchos de cierre registradas también llamados en una no especificado orden cuando la JVM se inicia el cierre; p.ej. en respuesta a un CTRL-C.

Los hilos de aplicación no se "detienen" de ninguna manera bien definida. De hecho, podrían continuar funcionando hasta que el proceso finalice.

Si desea que sus hilos se cierren de manera ordenada, debe hacer algo en un gancho de apagado para que esto suceda. Por ejemplo, un gancho de desconexión puede llamar al Thread.interrupt() para indicar a los subprocesos de trabajo que dejen de hacer lo que están haciendo ... y llamar al join() para asegurarse de que haya sucedido.

+0

Precaución; 'Thread.join()' puede causar un interbloqueo durante el apagado a la espera de un hilo que no respeta la interrupción. Es una buena idea usar ['Thread.join (long)'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-) con un tiempo de espera razonable para garantizar que los hilos que se comportan mal no bloqueen la salida del proceso. – dimo414

+0

Buen punto. Sin embargo, si tiene un hilo que no responde correctamente a una interrupción y desconecta la JVM independientemente, entonces existe el riesgo de que algo se descarte. Entonces, IMO, un mejor enfoque es encontrar y corregir la causa del "punto muerto"; es decir, cambiar el hilo ofensivo para tratar las interrupciones correctamente. –

5

Sé que puede especificar lo que debería suceder cuando se pulsa Ctrl-C agregando un gancho de apagado. Pero no estoy seguro en qué orden.

private static void createShutDownHook() 
{ 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() 
    { 

     @Override 
     public void run() 
     { 
      System.out.println(); 
      System.out.println("Thanks for using the application"); 
      System.out.println("Exiting..."); 

     } 
    })); 
} 
Cuestiones relacionadas