2015-06-16 14 views
5

ho visto una domanda posta da here @Tej Kiran che è esattamente la mia domanda, ma non riceve risposta, l'ultimo commento dice:Come impedire al gancio di arresto di ottenere un deadlock?

"Sa se ci sono dei ganci di arresto registrati nel vostro applicazione, o se una delle librerie che si sta utilizzando ha un hook di shutdown ? Il hook di shutdown è un thread, e se c'è un deadlock in quel thread che non termina mai, la JVM non uscirà mai . "

C'è un gancio di arresto metodo nel mio programma

Runtime.getRuntime().addShutdownHook(new Thread("Shutdown Hook") { 
    @Override 
    public void run() { 

     System.out.println("---------------"); 
     System.out.printf("%d threads running%n", Thread.activeCount()); 

     Map<Thread, StackTraceElement[]> threads = Thread 
       .getAllStackTraces(); 
     for (Entry<Thread, StackTraceElement[]> e : threads.entrySet()) { 
      Thread t = e.getKey(); 

      System.out.printf("%s\t%s\t%s%n", t.getName(), 
        t.isDaemon(), t.isAlive()); 

      StackTraceElement[] elements = e.getValue(); 

      for (StackTraceElement trc : elements) { 
       System.out.println("\t" + trc); 
      } 
     } 

     System.out.println("---------------"); 

     try {UIUtil.cancelAllTasks();} catch (Throwable e) {e.printStackTrace();}; 

     try {mehad.io.port.ScannerManager.disableAutoHandshake();} catch (Throwable e) {e.printStackTrace();}; 

     try {mehad.io.port.ComPortInterface.getInstance().close();} catch (Throwable e) {e.printStackTrace();}; 

     try { 
      if (lockStream != null) { 
       lockStream.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

Ma non so come distinguere se v'è una situazione di stallo nel mio gancio di arresto e se c'è, come risolverlo .

+0

hai provato a uccidere -3? o sulle meraviglie jstack? –

+0

Non so come farlo ?! @ThomasKrieger –

+0

stai usando windows o linux? –

risposta

0

Per iniziare, lo ShutdownHook funziona correttamente. Ora su deadlock.

Sai se sono presenti ganci di arresto registrati nell'applicazione ?

Sono abbastanza sicuro che non ci sono cose del genere perché se c'è un altro deadlock in alcune parti di terze parti allora la tua app sarebbe bloccata anche senza il tuo hook. Credo che non sia il fatto perché hai lamentato il tuo codice - quindi senza il tuo hook funziona bene e quindi non ci sono ganci di terze parti.

vostra situazione di stallo è in una di queste chiamate:

try {UIUtil.cancelAllTasks();} catch (Throwable e) {e.printStackTrace();}; 

      try {mehad.io.port.ScannerManager.disableAutoHandshake();} catch (Throwable e) {e.printStackTrace();}; 

      try {mehad.io.port.ComPortInterface.getInstance().close();} catch (Throwable e) {e.printStackTrace();}; 

      try { 
       if (lockStream != null) { 
        lockStream.close(); 
       } 

fatto che essi sono avvolti nel blocco try/catch non le impedisce di essere morto.

Non esiste alcun codice fornito su questi metodi. Anche lockStream.close(); potrebbe bloccare la tua esecuzione.

Rimuovere loro uno mio e vedere che cosa sta causando il blocco. Poi vai dentro e vedi cosa li blocca effettivamente.

0

La mia risposta:

sai sembra che non ha nulla a che fare con il gancio di arresto! Avevo usato WindowListener per chiudere MainFrame, ho aggiunto una condizione se mostrare un messaggio se l'utente vuole uscire o no? e se la risposta è sì, va a System.exit (0). in precedenza non c'era la condizione da chiedere prima di chiudere la finestra. E ora funziona bene! anche su alcune macchine rare che prima non funzionavano. Ma ancora non so come funziona bene con quella linea aggiunta! Sarei grato se qualcuno potesse spiegare come funziona ora!

 this.addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent ev) { 

         try { 
          ComPortInterface.getInstance().close(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
//this if condition is added to ask if you want to exit or not 
         if (MessageUtil.showYesNo("Exit ?")) { 
          System.exit(0); 
         } 

        // System.exit(0); 
        } 
       }); 
Problemi correlati