2015-06-16 3 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 की कोशिश की है? या आश्चर्य पर jstack? –

+0

मुझे नहीं पता कि यह कैसे करना है ?! @ थॉमसक्रिगर –

+0

क्या आप विंडोज या लिनक्स का उपयोग कर रहे हैं? –

उत्तर

0

प्रारंभ के लिए - आपका शट डाउनहूक ठीक काम करता है। अब डेडलॉक्स के बारे में।

क्या आप जानते हैं कि आपके एप्लिकेशन में कोई शट डाउन हुक पंजीकृत है या नहीं?

मुझे पूरा यकीन है कि ऐसी कोई चीज नहीं है क्योंकि अगर किसी तीसरे पक्ष के हिस्से में कोई और डेडलॉक है तो आपका ऐप आपके हुक के बिना भी लॉक हो जाएगा। मेरा मानना ​​है कि यह तथ्य नहीं है क्योंकि आपको अपने कोड के बारे में शिकायत है - इसलिए आपके हुक के बिना यह ठीक काम करता है और इसलिए कोई तीसरी पार्टी हुक नहीं है।

आपका गतिरोध इन कॉल में से एक में है:

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

तथ्य है कि वे आज़माएं/कैच ब्लॉक में लपेटा जाता है उन्हें गतिरोध होने का नहीं रोकता है।

इन तरीकों के बारे में कोई कोड प्रदान नहीं किया गया है। यहां तक ​​कि lockStream.close(); आपके निष्पादन को लॉक कर सकता है।

उन्हें एक मेरा हटाएं और देखें कि आपकी अवरोध क्या हो रही है। फिर अंदर जाओ और देखें कि वास्तव में उन्हें क्या अवरुद्ध करता है।

0

मेरा अपना जवाब:

क्या आप जानते हैं ऐसा लगता है यह बंद हुक के साथ कोई संबंध नहीं है कि! मैं मेनफ्रेम को बंद करने के लिए विंडो लिस्टनर का उपयोग करता था, अगर कोई संदेश दिखाना है या नहीं, तो क्या मैं एक शर्त जोड़ता हूं या नहीं? और अगर जवाब हाँ था तो यह 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); 
        } 
       }); 
संबंधित मुद्दे