Friday 15 August 2014

java - Why does my thread stop when I try to access a synchronized list? -


किसी कारण से, इसका उत्पादन:

  सार्वजनिक शून्य msgNeedParts () {/ / Blabla ... System.out.println (नाम + ": 'कार्यों को प्रिंट करने का प्रयास करें ...'); सिंक्रनाइज़ (कार्य) {System.out.println (नाम + ": कार्य -" + कार्य); System.out.println (नाम + ": क्या मैंने इसे प्रिंट करने का प्रबंधन किया?"); Tasks.add (नया BinToDump (फीडर, बिननम)); } राज्य बदले गए (); }  

बस "गैन्ट्री एजंट प्रिंट करता है: कार्य को प्रिंट करने का प्रयास करें ..." लेकिन निम्न संदेशों में से कोई भी नहीं। सिंक्रनाइज़ किए गए सूची 'कार्यों' तक पहुंचने की कोशिश करते समय मैं धागा अनुमान लगाता हूं, किसी तरह 'फंस जाता है', लेकिन मुझे नहीं पता कि यह क्यों हो रहा है।

'कार्य' की घोषणा की गई थी और इस तरह शुरू किया गया था:

<पूर्व> निजी सूची & lt; BinToDump & gt; कार्यों = संग्रह। सिंक्रनाइज़ किए गए सूची (नया अर्रेलिस्ट & lt; BinToDump & gt; ());

क्या कोई मुझे बताता है कि मुझे क्या याद आ रहा है?

आह! मुझे संदेह है कि मेरे पास एक अपराधी हो सकता है:

  / * यदि कुछ नहीं छोड़ा गया है, तो मूल स्थिति पर लौटें। * / सिंक्रनाइज़ (कार्य) {यदि (tasks.isEmpty ()) {doReturnToOriginalPos (); }}  

मेरे अनुसूचक में (यह एक एजेंट डिजाइन है), मैं यह देखने के लिए जांचता हूं कि 'कार्य' खाली है, फिर मैं doReturnToOriginalPos () को कॉल करता हूं। हो सकता है कि यह अभी और इतनी तेज़ी से हो रहा है कि अन्य विधियों को इसे संशोधित करने का मौका नहीं मिलता?

यही वास्तव में समस्या थी! यह मेरे अनुसूचक में इतनी तेज़ी से बुला रहा था कि कुछ भी 'कार्य' का उपयोग नहीं कर सके मदद के लिए धन्यवाद!

कुछ कार्यों पर एक लॉक है यह किस प्रकार के आवेदन के आधार पर, आपको सिस्टम का एक पूर्ण स्टैक डंप प्राप्त करने में सक्षम होना चाहिए, लेकिन विधि भिन्न होती है। उदाहरण के लिए, मुझे लगता है कि ज्यादातर विंडोज़ आधारित एपसेरर्स पर सीटीआरएल ब्रेक ऐसा करेंगे, और मुझे लगता है कि लिनक्स पर एक SIGQUIT भेजने से ऐसा ही होगा।

एक बार जब आप एक स्टैक डंप लेते हैं, तो आप इसे देख सकते हैं

आप एक ही अंत लक्ष्य के लिए एक स्टैक डंप प्राप्त करने के लिए भी उपयोग कर सकते हैं:

आप कर सकते हैं एक स्थानीय अनुप्रयोग चल रहा है, जबकि एक धागा डंप (स्टैक ट्रेस) लेने के लिए जावा VisualVM का उपयोग करें। एक धागे डंप लेना आवेदन बंद नहीं करता है। जब आप थ्रेड डंप प्रिंट करते हैं, तो आपको थ्रेड स्टैक का एक प्रिंटआउट मिलता है जिसमें जावा थ्रेड्स के लिए थ्रेड स्टेट शामिल है।

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


No comments:

Post a Comment