2012-08-06 19 views
5

जहाँ तक मुझे पता है कि लिंक्ड सूची और सरणी दोनों बिना सीमा के बढ़ सकते हैं या मैं गलत हूं? लेकिन जब मैं documentation in the Executor Service से गुजर चुका हूं, तो मुझे यह दिखाई देता है:क्यों ArayBlockingQueue को एक बाध्य कतार कहा जाता है जबकि एक LinkedBlockingQueue को एक अवरुद्ध अवरुद्ध कतार कहा जाता है?

असंबद्ध कतार। एक unbounded कतार का उपयोग (उदाहरण के लिए पूर्वनिर्धारित क्षमता के बिना LinkedBlockingQueue) सभी कोरपूल आकार धागे व्यस्त होने पर कतार में प्रतीक्षा करने के लिए नए कार्यों का कारण बन जाएगा। इस प्रकार, CorePoolSize धागे से कहीं अधिक नहीं बनाया जाएगा। जब LinkedBlockingQueue एक परिभाषित क्षमता है (और maximumPoolSize की मूल्य इसलिए कोई असर नहीं होता है।)

तो Unbounded Queue गुण परिवर्तन करता है?

और यह ArrayBlockingQueue के लिए लिखा:

घिरा कतारों। एक बाध्य कतार (उदाहरण के लिए, एक ArrayBlockingQueue) सीमित अधिकतम पुल आकार के साथ उपयोग किए जाने पर संसाधन थकावट को रोकने में मदद करता है, लेकिन ट्यून और नियंत्रण करना अधिक कठिन हो सकता है। कतार आकार और अधिकतम पूल आकारों को एक-दूसरे के लिए बंद किया जा सकता है: का उपयोग करना बड़ी कतार और छोटे पूल सीपीयू उपयोग, ओएस संसाधन, और संदर्भ-स्विचिंग ओवरहेड को कम करता है, लेकिन कृत्रिम रूप से कम थ्रूपुट का कारण बन सकता है। यदि कार्य अक्सर अवरुद्ध होते हैं (उदाहरण के लिए यदि वे I/O बाध्य हैं), तो एक सिस्टम से अधिक थ्रेड के लिए समय निर्धारित करने में सक्षम हो सकता है, अन्यथा आप अनुमति देते हैं। छोटी कतारों के उपयोग के लिए आमतौर पर बड़े पूल आकार की आवश्यकता होती है, जो सीपीयू को व्यस्त रखता है लेकिन अस्वीकार्य शेड्यूलिंग ओवरहेड का सामना कर सकता है, जो थ्रूपुट भी कम करता है।

उत्तर

7

आपको क्यों लगता है कि ArrayBlockingQueue सीमा के बिना बढ़ सकता है? इसके own documentation से:

यह जिसमें एक निश्चित आकार सरणी निर्माताओं द्वारा डाला जाता है और उपभोक्ताओं द्वारा निकाले तत्वों रखती है एक क्लासिक "बफ़र घिरा" है। एक बार बनाया गया, क्षमता में वृद्धि नहीं की जा सकती है। एक पूर्ण कतार में तत्व डालने के प्रयासों के परिणामस्वरूप ऑपरेशन अवरुद्ध हो जाएगा; खाली कतार से तत्व लेने का प्रयास समान रूप से अवरुद्ध होगा।

दूसरे शब्दों में, एक बार यह पूरा हो जाने पर, यह पूर्ण हो जाता है - यह नहीं बढ़ता है।

क्या आप किसी भी मौके से ArrayList से भ्रमित हो रहे हैं - जिसे किसी सरणी द्वारा भी समर्थित किया जाता है, लेकिन यह आवश्यकतानुसार इसे विस्तारित करता है?

तो क्या लिंक्डब्लॉकिंग क्यूई की परिभाषित क्षमता होने पर अनबाउंड कतार संपत्ति बदलती है?

हां, इसलिए इसे Javadocs में "वैकल्पिक रूप से बाध्य" के रूप में वर्णित क्यों किया गया है। इसके अलावा, दस्तावेज़ बताते हैं कि (जोर मेरा):

वैकल्पिक क्षमता बाध्य कन्स्ट्रक्टर तर्क अत्यधिक कतार विस्तार को रोकने के लिए एक तरीका के रूप में कार्य करता है। क्षमता, अगर निर्दिष्ट नहीं है, तो Integer.MAX_VALUE के बराबर है।लिंक्ड नोड्स गतिशील रूप से प्रत्येक प्रविष्टि पर बनाई गई हैं, जब तक कि इस क्षमता ऊपर कतार लाना होगा।

+0

@Andrej सरणी के लिए हाँ मैं भ्रमित हूँ ArrayList है। स्पष्टीकरण के लिए धन्यवाद। बीटीडब्ल्यू एरेलीलिस्ट कैसे बढ़ता है जब इसे अंतर्निहित सरणी द्वारा समर्थित किया जाता है जो बढ़ नहीं सकता है? – Geek

+4

जब इसे आकार बदलने की आवश्यकता होती है, तो 'ArrayList' एक नई, बड़ी सरणी आवंटित करता है और सभी तत्वों को उस नई सरणी में प्रतिलिपि बनाता है। –

2

जहाँ तक मुझे पता दोनों लिंक्ड सूची और सरणी सीमा के बिना विकसित कर सकते हैं या मैं गलत

एक लिंक्ड सूची एक असीमित आकार के रूप में कर रहा हूँ के रूप में। एक सरणी तय आकार है। एक ArrayList एक सरणी लपेटता है और इसे एक बड़ा की जरूरत है जब इसे बदल देता है।

तो असीम कतार गुण परिवर्तन करता है जब LinkedBlockingQueue एक परिभाषित क्षमता

जब LinkedBlockingQueue एक अधिकतम क्षमता है, यह घिरा है है, लेकिन यह डिफ़ॉल्ट रूप से इस तरह से इस्तेमाल नहीं किया।

+1

"एक सरणीसूची एक सरणी को लपेटती है जब इसे एक बड़े की आवश्यकता होती है।" आप इसे ArrayList के लिए सुनिश्चित क्षमता विधि में देख सकते हैं। –

3

documentataion से के लिए ArrayBlockingQueue

एक एक सरणी द्वारा समर्थित कतार अवरुद्ध घिरा। यह कतार एफआईएफओ (पहले-इन-फर्स्ट-आउट) तत्वों का ऑर्डर करती है। कतार का सिर वह तत्व है जो कतार पर सबसे लंबा समय रहा है। कतार की पूंछ वह तत्व है जो कतार पर सबसे कम समय पर रही है। कतार की पूंछ पर नए तत्व डाले जाते हैं, और कतार पुनर्प्राप्ति संचालन कतार के सिर पर तत्व प्राप्त करते हैं।

यदि आप नोट करते हैं कि ArrayBlockingQueue के सभी निर्माता एक क्षमता लेते हैं क्योंकि इस वर्ग को बाध्य करने के लिए डिज़ाइन किया गया था। यह विकल्प इसलिए बनाया गया था क्योंकि यदि आप एक समवर्ती कतार चाहते हैं, तो संभवतः आप एरेडलिस्ट को आकार देने के साथ ओवरहेड नहीं चाहते हैं। इसलिए, यदि आप एक असंबद्ध कतार चाहते हैं तो LinkedBlockingQueue एक बेहतर विकल्प है क्योंकि इसमें इस ओवरहेड को शामिल नहीं किया गया है।

2

javadoc for LinkedBlockingQueue का कहना है:

एक वैकल्पिक-घिरा अवरुद्ध कतार जुड़ा हुआ नोड्स के आधार पर [...]

वैकल्पिक क्षमता बाध्य निर्माता तर्क के तरीके के रूप में कार्य करता है को रोकने के अत्यधिक कतार विस्तार। । क्षमता, यदि निर्दिष्ट नहीं है, तो Integer.MAX_VALUE के बराबर है।

javadoc of ArrayBlockingQueue का कहना है:

एक एक सरणी द्वारा समर्थित कतार अवरुद्ध घिरा [...]

यह एक क्लासिक है "घिरा बफ़र" है, जो एक निश्चित आकार सरणी में। उत्पादकों द्वारा डाले गए तत्व और उपभोक्ताओं द्वारा निकाले गए तत्व हैं। एक बार जब बनाया, क्षमता

तो वृद्धि हुई नहीं किया जा सकता, किसी लिंक किए गए अवरुद्ध कतार कहां असीम घिरा जा सकता है, जबकि एक ArrayBlockingQueue हमेशा घिरा है।

0

अन्य जवाब बहुत सही है! मैं समझाने का एक और तरीका प्रदान करता हूं। अच्छी तरह से, मैं भी "अनबाउंड और बाध्य" शब्द से भ्रमित हो जाता हूं। आप स्रोत कोड blew देख सकते हैं।

/** The queued items */ 
final Object[] items; 

/** items index for next take, poll, peek or remove */ 
int takeIndex; 

/** items index for next put, offer, or add */ 
int putIndex; 

/** Number of elements in the queue */ 
int count; 
स्रोत कोड से

, हम देख सकते हैं सरणी अंतिम है, इसलिए हम सरणी का आकार नहीं कर सकते हैं। यदि LinkedBlockingQueue का उपयोग करें, तो हम हमेशा अधिक तत्व जोड़ सकते हैं ... और स्रोत कोड में, अगला संदर्भ अंतिम नहीं है। नोट, सिद्धांत रूप में, LinkedBlockingQueue unbounded नहीं है। क्योंकि यह केवल MAX_INTEGER शून्य 8 तत्वों को स्टोर कर सकता है। जावाडोक से, असंबद्ध कतार प्राथमिकताब्लॉकिंग्यूयू है। लेकिन प्राथमिकताब्लॉकिंग्यूयूयू केवल MAX_INTEGER-8 तत्वों को स्टोर कर सकता है। इसलिए मुझे लगता है कि कोई सही असीम सूची बनाएं ...