2013-04-04 6 views
6

मैं सिर्फ JDK 1.7.0_03 खोलने के लिए ओरेकल JDK 1.6, इसे अपनाया है, और मैं बाहर निकलने पर एक नहीं बल्कि उल्लेखनीय गतिरोध पर पहुंच जाते हैं:सिस्टम.एक्सिट लिनक्स पर थ्रेड-सुरक्षित नहीं है?

java.lang.Thread.State: WAITING (on object monitor) 
at java.lang.Object.wait(Native Method) 
at java.lang.Thread.join(Thread.java:1258) 
- locked <0x8608dda0> (a sun.awt.X11.XToolkit$1$1) 
at java.lang.Thread.join(Thread.java:1332) 
at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106) 
at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46) 
at java.lang.Shutdown.runHooks(Shutdown.java:123) 
at java.lang.Shutdown.sequence(Shutdown.java:167) 
at java.lang.Shutdown.exit(Shutdown.java:212) 
- locked <0x8603df28> (a java.lang.Class for java.lang.Shutdown) 
at java.lang.Runtime.exit(Runtime.java:107) 
at java.lang.System.exit(System.java:960) 

ऐसा लगता है कि आप AWT से System.exit कॉल करना होगा घटना कतार क्या यह सच है? सन डॉक्स Runtime.exit

में थ्रेड आवश्यकता का कोई दस्तावेज नहीं है, मैंने अन्य आश्चर्यजनक मामलों को मारा है जहां एडब्ल्यूटी ट्री लॉक केवल लिनक्स पर आवश्यक है, लेकिन यह केक लेता है। क्या यह एक बग है, या क्या मैंने अभी दस्तावेज़ में कुछ याद किया है?

+2

एक SSCCE (http://sscce.org/) गतिरोध का प्रदर्शन मिल गया? – NPE

+0

'वर्चुअल.एक्सिट' विधि जावा वर्चुअल मशीन में सभी थ्रेडों को समाप्त करने के लिए मजबूर करता है। आप सिस्टम.एक्सिट का उपयोग कर उल्लिखित डेडलॉक समस्या को ठीक नहीं कर रहे हैं, आप डेडलॉक होने से पहले प्रोग्राम को रोक रहे हैं। जब आप सामान्य रूप से रुकते हैं, तो आपके अन्य थ्रेड मुख्य धागे की सहायता के बिना जारी रहते हैं और स्पष्ट रूप से वे इसके बिना ऐसा नहीं कर सकते हैं। –

उत्तर

1

यह निर्भर करता है कि runHooks विधि Runtime.addShutdownHook के माध्यम से पंजीकृत किसी भी हुक थ्रेड को शुरू करेगी और उन्हें समाप्त होने का इंतजार करेंगी। यदि आपके किसी भी हुक थ्रेड कुछ संसाधनों को लॉक कर रहा है जो एडब्ल्यूटी इवेंट थ्रेड की भी आवश्यकता है, तो वे मृत लॉक का कारण बन सकते हैं।

आप अपने AWT घटना सूत्र में System.exit कॉल करने के लिए है, तो मैं सुझाव है कि आप की तरह एक और धागा में यह कहते हैं:

new Thread(){ 
      public void run() { 
       System.exit(0); 
      } 
    }.start(); 
+0

मुझे यह स्निपेट पसंद है। यह वास्तव में सुंदरता की बात है। धन्यवाद। –

1

यह कहना कि क्या यह जानने के बिना क्रम में एक बग है असंभव है आवेदन क्या कर रहा है इसके बारे में अधिक जानकारी (आदर्श रूप में, यह SSCCE का रूप लेगा)।

उदाहरण के लिए, निम्नलिखित System.exit() से संबंधित समान डेडलॉक प्रदर्शित करता है। हालांकि, यह स्पष्ट रूप से System.exit() में आवेदन में एक बग है, नहीं:

public class OhNo { 

    final static Object lock = new Object(); 

    public static void main(String[] args) { 
     new Thread(new Runnable() { 
      public void run() { 
       synchronized (lock) { 
        for (;;) { 
        } 
       } 
      } 
     }).start(); 
     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
      public void run() { 
       synchronized (lock) { 
        System.out.println("in shutdown hook"); 
       } 
      } 
     })); 
     System.out.println("about to call System.exit()"); 
     System.exit(0); 
    } 
} 
+0

एडब्ल्यूटी-इवेंटक्यूयू -0 मुझे कॉल कर रहा है, और मैं ऑब्जेक्ट पर लॉक पकड़ रहा हूं ओ ओ व्यस्त है इसलिए एडब्ल्यूटी-इवेंट क्यूयू -0 इंतजार अवरुद्ध है। हे System.exit(), और लिनक्स पर कॉल कर रहा है, यह एडब्ल्यूटी ट्री लॉक के लिए इंतजार कर रहा है, जो निश्चित रूप से ओ पर इंतजार कर रहा है। इसलिए, डेडलॉक। वैसे भी, मुझे लगता है कि इन शट डाउन हुक हैं जो किसी भी अजीब बात कर रहे हैं, सही जवाब है कि स्प्रिंग द्वारा सुझाए गए अनुसार एक नया थ्रेड बंद करें। रुश। यह बहुत मजबूत लगता है। –

संबंधित मुद्दे