2015-06-16 22 views
5

Ben tam benim sorum @Tej Kiran tarafından sorulan bir soru here gördüğüm ama cevap verilmemiş, son yorum diyor ki:Kapatma kancasının kilitlenmesini nasıl önleyebilirim?

"senin kayıtlı herhangi bir kapatma kanca varsa biliyor musunuz uygulama, ya da kullanmakta olduğunuz kütüphanelerden herhangi biri kapatma kancası var mı? Kapatma kancası bir iş parçacığıdır ve bu iş parçacığının hiçbir zaman sonlanmasına neden olmayan bir kilitlenme varsa, JVM hiçbir zaman çıkmaz. "

programıma

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

bir yöntem kapatma kanca vardır Ama kapatma çengel kilitlenme varsa ayırt bilmiyorum ve eğer varsa, nasıl çözmek için .

+0

-3 öldürmeyi denediniz mi? ya da üzerinde jstack? –

+0

Bunu nasıl yapacağımı bilmiyorum? @ThomasKrieger –

+0

Windows veya linux kullanıyor musunuz? –

cevap

0

Başlamak için - ShutdownHook'unuz iyi çalışıyor. Şimdi deadlock'lar hakkında.

uygulamanızda kayıtlı herhangi bir kapatma kanca olup olmadığını biliyor musunuz?

Böyle bir şey olmadığından eminim çünkü bazı üçüncü taraf bölümlerinde başka bir kilitlenme varsa, uygulamanız bile çengeliniz olmadan kilitlenir. Bence bu senin suçun hakkında şikayet ettiğin için gerçek olmadığına inanıyorum - bu yüzden senin çeneni olmadan iyi çalışıyor ve böylece üçüncü parti kancaları yok.

Kişisel kilitlenme bu çağrılardan birinde: onlar try/catch bloğu içine sarılmış olduğu

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

Fact kilitlenme olma bunları önlemez.

Bu yöntemler hakkında herhangi bir kod bulunmamaktadır. LockStream.close() bile; infazını kilitleyebilir.

Bunları birer birer çıkarın ve engellemenize neden olan şeyleri görün. Sonra içeri gir ve aslında onları engelleyen şeyi gör.

0

Kendi cevap:

Eğer buna kapatma kancası ile ilgisi yoktur görünüyor biliyorum! MainFrame'i kapatmak için WindowListener'ı kullandım, kullanıcının mesaj bırakmak isteyip istemediğini gösteren bir durum ekledim. Cevabı evet ise, System.exit (0) 'a gider. Daha önce, pencereyi kapatmadan önce sorulacak şart yoktu. Ve şimdi iyi çalışıyor! Daha önce çalışmayan bazı nadir makinelerde bile. Ama yine de bu satırın nasıl eklendiğini bilmiyorum! Herkesin nasıl iyi çalıştığını açıklayabilirse minnettar olurum!

 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); 
        } 
       }); 
İlgili konular