2014-04-30 8 views
18

जब एक अनंत लूप में एक कतार से मान लेने वाली - क्या और अधिक कुशल होगा:जावा BlockingQueue ले() बनाम चुनाव()

1) एक मूल्य तक कतार अवरोधित ले माध्यम से उपलब्ध है()

while (value = queue.take()) { doSomething(value); } 

2) n मिलीसेकंड के लिए सो रही है और अगर एक आइटम उपलब्ध

while (true) { 

    if ((value = queue.poll()) != null) { doSomething(value); } 

    Thread.sleep(1000); 
} 
+1

मेरे अनुभव के अनुसार, थ्रेड ब्लॉकिंग्यूयू में संदेश का उत्पादन/उपभोग करने का सबसे अच्छा तरीका है। –

+0

जावा के पास शर्त के रूप में असाइनमेंट स्टेटमेंट के साथ थोड़ी देर लूप कैसे हो सकती है? – davidchoo12

+0

"कुशल" बहुत सी चीजें हो सकती हैं: कम विलंबता, उच्च थ्रूपुट, कम ऊर्जा उपभोग करने वाला (मोबाइल) इत्यादि। यदि आप अधिक पृष्ठभूमि जानकारी प्रदान करते हैं तो आपको बेहतर अनुकूल उत्तर मिलेंगे। एक अच्छी तरह से समझाया सरल उत्तर के लिए – Renan

उत्तर

41

ब्लॉक कर रहा है की जाँच की संभावना अधिक सक्षम है। पृष्ठभूमि में, प्रारंभिक रूप से take() कॉल करने वाला थ्रेड सो जाता है यदि कोई तत्व उपलब्ध नहीं है, अन्य धागे को जो कुछ भी करने की ज़रूरत है उसे करने दें। क्यूई में तत्व जोड़ने वाले तरीकों को तब तत्व थ्रेड होने पर प्रतीक्षा थ्रेड उठेंगे, इसलिए तत्व उपलब्ध होने के लिए कतार की जांच करने में न्यूनतम समय व्यतीत होता है।

+1

+1। – JamesENL

+10

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

0

सावधान रहें जब आप take() का उपयोग करते हैं। यदि आप सेवा और सेवा से take() का उपयोग कर रहे हैं तो डीबी कनेक्शन है।

यदि take() स्टेल कनेक्शन समय अवधि के बाद वापस आ गया है तो यह स्टाइल कनेक्शन अपवाद फेंक देगा।

पूर्वनिर्धारित प्रतीक्षा समय के लिए मतदान का उपयोग करें और लौटे ऑब्जेक्ट के लिए शून्य जांच जोड़ें।

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