2012-07-11 13 views
11

quando si preme ctrl - c in consolle in quale sequenza sono thread delle applicazioni fermati e ganci di arresto chiamano?Come funziona CTRL-C con programma Java

+2

per citare i documenti: [Quando la macchina virtuale inizia la sua sequenza di spegnimento, avvierà tutti i ganci di arresto registrati in un ordine non specificato e li lascerà funzionare contemporaneamente. Al termine di tutti gli hook, eseguirà tutti i finalizzatori non inviati se è stata abilitata la finalizzazione all'uscita.] (Http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html) in questo modo possiamo raccogliere gli hook di shutdown che vengono sempre chiamati prima a prescindere, il che ha senso o quale sarebbe il punto di un tale hook se i thread vengono arrestati per primi? Per dire a un utente che i suoi dati sono andati –

risposta

8

Secondo javadoc, i ganci di arresto registrati sono chiamati in un imprecisato ordine all'avvio della JVM chiusura; per esempio. in risposta a un CTRL-C.

I thread di applicazione non vengono "arrestati" in alcun modo ben definito. In effetti, potrebbero continuare a correre fino a quando il processo non termina.

Se si desidera che i thread vengano chiusi in modo ordinato, è necessario eseguire un'operazione in un hook di chiusura per fare in modo che ciò accada. Ad esempio, un hook di shutdown potrebbe chiamare Thread.interrupt() per dire ai thread worker di interrompere ciò che stanno facendo ... e chiamare join() per assicurarsi che sia successo.

+0

Attenzione; 'Thread.join()' può causare un deadlock durante lo spegnimento in attesa di un thread che non rispetta l'interruzione. È una buona idea usare ['Thread.join (long)'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-) con un ragionevole timeout per assicurare che i thread non funzionanti non blocchino l'uscita del processo. – dimo414

+0

Buon punto. Tuttavia, se si dispone di un thread che non risponde correttamente a un interrupt e si disconnette la JVM a prescindere, si rischia che qualcosa possa essere spostato nel cestino. Quindi, IMO, un approccio migliore è trovare e risolvere la causa dello "stallo"; Ad esempio, modificare il thread offendente per gestire correttamente gli interrupt. –

5

So che è possibile specificare cosa dovrebbe accadere quando Ctrl-C viene colpito aggiungendo un hook di arresto. Ma non sono sicuro in quale ordine.

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..."); 

     } 
    })); 
}