Saturday 15 June 2013

java - Why does "header.get() + footer.get()" result in deadlock, when using a single threaded Executor? -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 2 जवाब

यह 8.1 में सूचीबद्ध है:

<पूर्व> सार्वजनिक वर्ग थ्रेडडल्डक्लॉक {निष्पादक सेवा exec = निष्पादक। NewSingleThreadExecutor (); पब्लिक क्लास रेंडरपेजटैक्स लागू करता है कॉलबल & lt; स्ट्रिंग & gt; {सार्वजनिक स्ट्रिंग कॉल () फेंकता अपवाद {भविष्य & lt; स्ट्रिंग & gt; अगुआ पुछल्ला; हेडर = exec.submit (नया लोडफाइल टास्क ("header.html")); पादलेख = exec.submit (नया लोडफाइल टास्क ("footer.html")); स्ट्रिंग पृष्ठ = रेंडरबीडी (); // डेडलॉक - सबटास्क रिटर्न header.get () + पेज + पादरी .get () के परिणाम के लिए काम इंतजार; }}}

यह है

अध्याय 8: थ्रेड पूल > अनुभाग 8.1.1 थ्रेड भुखमरी गतिरोध

और इसमें कैप्शन है:

"एक एकल-थ्रेडेड एक्जीक्यूट में डेडलॉक कार्य। ऐसा मत करो। < / Em> "

यह एक गतिरोध में क्यों परिणाम है? मैं सोचा header.get () को कहा जाता है, और फिर footer.get () कहलाता है, जो प्रत्येक परिणाम स्ट्रिंग से जुड़ा होता है

प्रासंगिक अध्याय पाठ:

8.1.1 थ्रेड भुखमरी गतिरोध

P> यदि कार्य जो थ्रेड पूल में निष्पादित अन्य कार्यों पर निर्भर करते हैं, तो वे डेडलॉक कर सकते हैं। एकल-थ्रेडेड निष्पादक में, एक ऐसा कार्य जो एक ही नियुक्तकर्ता को दूसरे कार्य को प्रस्तुत करता है और इसके परिणाम के लिए प्रतीक्षा करता है, वह हमेशा गतिरोध होगा दूसरा कार्य कार्य कतार पर बैठता है जब तक कि पहले कार्य पूर्ण नहीं हो जाता, लेकिन पहले पूरा नहीं होगा क्योंकि यह दूसरे कार्य के resut के लिए इंतजार कर रहा है। एक ही बात बड़े थ्रेड पूल में हो सकती है अगर सभी थ्रेड कार्य निष्पादित कर रहे हैं जो कार्य कतार में अभी भी अन्य कार्यों की प्रतीक्षा कर रहे हैं। इसे थर्ड भुखमरी डेडलॉक कहा जाता है, और तब भी हो सकता है जब पूल कार्य किसी ऐसे संसाधन या स्थिति के लिए एक असीमित अवरोधन की प्रतीक्षा करता है जो कि केवल दूसरे पूल कार्य की कार्रवाई के माध्यम से सफल हो सकता है, जैसे कि रिटर्न वैल्यू या किसी दूसरे कार्य का साइड इफेक्ट, जब तक कि आप गारंटी नहीं दे सकते कि पूल पर्याप्त बड़ा है।

थ्रेडडलाइन में लिस्टिंग 8.1 में थ्रेड भुखमरी के शिकार के बारे में बताता है। रेंडरपेज टास्क दो अतिरिक्त कार्य को एक्जीक्यूट ओ पेज हेडर और पादलेख लाने के लिए प्रस्तुत करता है, पेज बॉडी को प्रस्तुत करता है, हेडर और पादलेख कार्यों के परिणामों की प्रतीक्षा करता है, और फिर हेडर, बॉडी, और फ़ूटर को समाप्त पेज में एकल-थ्रेडेड निष्पादक के साथ, थ्रेडडायडलॉक हमेशा गतिरोध होगा इसी तरह, एक अवरोध के साथ खुद को समन्वयित करने के कार्य भी भुखमरी के गतिरोध का कारण हो सकता है यदि पूल पर्याप्त नहीं है।

"post-text" itemprop = " पाठ ">

वास्तविक डेडलॉक होगा जैसे ही RenderPageTask की एक बहुत ही निष्पादक उदाहरण के लिए प्रस्तुत किया जाता है जहां यह अपने कार्य को प्रस्तुत करता है।

उदाहरण के लिए , जोड़

  exec.submit (नया रेंडरपेजटास्क ());  

और आप एक गतिरोध अनुभव करेंगे।

बेशक यह आसपास के कोड की एक समस्या (यानी, आप केवल परिभाषित और दस्तावेज कर सकते हैं कि आपके रेंडरपेज टास्क इस निष्पादक उदाहरण के लिए प्रस्तुत नहीं किया जाना चाहिए), लेकिन एक अच्छा डिजाइन इस तरह के नुकसान से पूरी तरह से बच जाएगा।

इसका उपयोग करने के लिए एक संभावित समाधान होगा, जो इस से बचने के लिए कार्य का उपयोग करता है संभव डेडलॉक का रूप।


No comments:

Post a Comment