2015-06-16 4 views
5

Я видел вопрос here заданный @Tej Киран, который точно мой вопрос, но он не ответил, последний комментарий говорит:Как предотвратить выключение крюка от блокировки?

«Вы знаете, если есть какие-либо отключения крючки, зарегистрированные в вашей приложение, или если какая-либо из библиотек, которые вы используете, имеет крючок остановки ? Крюк отключения - это поток, и если в этом потоке есть тупик , который никогда не заканчивается, JVM будет никогда не выходить. "

Существует метод выключения крюк в моей программе

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(); 
     } 
    } 
}); 

Но я не знаю, как отличить, если есть тупиковой в моем выключение крючок и, если есть, как ее решить ,

+0

Вы пытались убить -3? или на wondows jstack? –

+0

Я не знаю, как это сделать ?! @ThomasKrieger –

+0

Вы используете окна или Linux? –

ответ

0

Для начала - ваш ShutdownHook отлично работает. Теперь о взаимоблокировках.

Знаете ли вы, есть ли крючки остановки, зарегистрированные в вашем приложении ?

Я уверен, что таких вещей нет, потому что, если в какой-то третьей части есть другой тупик, ваше приложение будет заблокировано даже без вашего крючка. Я считаю, что это не факт, потому что вы жалуетесь на свой код, поэтому без вашего крючка он отлично работает и поэтому нет сторонних крючков.

Ваш тупиковый находится в одном из этих вызовов:

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(); 
       } 

Факт, что они обернуты в Try/поймать блок не мешает им быть тупиковой.

Информация об этих методах отсутствует. Даже lockStream.close(); может заблокировать выполнение.

Удалите их один мой и посмотрите, что вызывает блокировку. Затем зайдите внутрь и посмотрите, что на самом деле блокирует их.

0

Мой собственный ответ:

вы знаете, кажется, что это не имеет ничего общего с отключаемым крючком! Я использовал WindowListener для закрытия MainFrame, я добавил условие, если показать сообщение о том, хочет ли пользователь уйти или нет? и если ответ был да, он переходит к System.exit (0). ранее не было условия, чтобы спросить перед закрытием окна. И теперь все работает отлично! даже на некоторых редких машинах, которые раньше не работали. Но все же я не знаю, как это прекрасно работает с этой линией! Буду признателен, если кто-нибудь сможет объяснить, как это работает сейчас!

 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); 
        } 
       });