2012-02-05 13 views
13

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

BlockingQueue<String> q = new SynchronousQueue<String>(); 
      ... 
     fstream = new FileInputStream("/path/to/file.txt"); 
      ... 
     while ((line = br.readLine()) != null) { 
      if (q.offer(line)) 
       System.out.println("Depth: " + q.size()); //0 
     } 

जब add साथ offer की जगह, अपवाद अगर फेंक दिया

Exception in thread "main" java.lang.IllegalStateException: Queue full 
    ... 

मैं गलत क्या कर रहा हूँ कृपया? पहले तत्व के सम्मिलन पर तुरंत कतार पूरी क्यों होती है?

उत्तर

17

चेक SynchronousQueue के लिए दस्तावेज़:

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

आपको कतार में जोड़ने का प्रयास करने से पहले उपभोक्ताओं को स्थापित करने और प्रतीक्षा करने की आवश्यकता है।

आवेषण इस कतार में निर्दिष्ट तत्व, अगर एक और धागा इसे प्राप्त करने के इंतज़ार कर रहा है: अगर कोई उपभोक्ता हैं

offer विधि कुछ भी नहीं है।

+3

RTFM ftw। धन्यवाद मैट। 10 मिनट – JAM

+16

में स्वीकार करेंगे वास्तव में, आप एक सिंक्रोनस कतार की उपस्थिति में भी ब्रेथ नहीं कर सकते क्योंकि वहां कोई हवा नहीं है। एक तुल्यकालिक कतार सब कुछ और कुछ भी नहीं है, यह हर जगह और कहीं भी नहीं है। तुल्यकालिक कतार के आध्यात्मिक प्रभाव केवल पृथ्वी के निवासियों द्वारा समझा नहीं जा सकता है। – Tudor

2

जावाडोक से:

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

1

की क्षमता भी नहीं, आप ArrayBlockingQueue का उपयोग कर सकते हैं। यह एक सरणी द्वारा समर्थित एक बाध्य अवरुद्ध कतार है। यह कतार एफआईएफओ (पहले-इन-फर्स्ट-आउट) तत्वों का ऑर्डर करती है। ArrayBlockingQueue एक क्लासिक "बाध्य बफर" है, जिसमें एक निश्चित आकार के सरणी उत्पादकों द्वारा डाले गए तत्वों और उपभोक्ताओं द्वारा निकाले गए तत्व रखती है। http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html (उन लोगों के लिए जो रेक पर भी कदम रखते हैं)

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