2013-08-27 7 views
5

मेरे पास ऐसी स्थिति है जहां एकाधिक धागे take() पर कॉल करके एक BlockingQueue पर मतदान करेंगे। मैं जो जानना चाहता हूं वह निम्नलिखित है:अवरुद्ध करने और थ्रेड एक्सेस ऑर्डर

यदि एकाधिक धागे कतार के लिए आइटम प्राप्त करने की प्रतीक्षा कर रहे हैं, तो उन्हें कतार से वस्तुओं को लेने के लिए प्राथमिकता दी जाएगी ताकि वे अपनी कॉल() या क्या वह आदेश जिसमें धागे कतार से चीजें लेते हैं मनमाना हो?

धन्यवाद!

नोट: मैंने अतीत में इस तरह की चीज़ के लिए अपने स्वयं के कार्यान्वयन लिखे हैं, लेकिन मुझे आश्चर्य है कि जावा में अवरुद्ध क्यूई कार्यान्वयन मेरे लिए ऐसा करेगा या नहीं।

+1

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

+1

दिलचस्प सवाल, मैंने एक कार्यक्रम लिखा है और चलाया है - कोई निश्चित आदेश नहीं है। – Tala

+1

[संबंधित प्रश्न] (http://stackoverflow.com/questions/1301691/java-queue-implementations-which-one) जो निष्पक्षता पर भी चर्चा करता है। –

उत्तर

4

यह कार्यान्वयन पर निर्भर करता है।

आप एक ReentrantLock

public E take() throws InterruptedException { 
    E x; 
    int c = -1; 
    final AtomicInteger count = this.count; 
    final ReentrantLock takeLock = this.takeLock; 
    takeLock.lockInterruptibly(); 
    ... 
} 

// declared as 
private final ReentrantLock takeLock = new ReentrantLock(); // no fairness argument, defaults to false 

के साथ एक LinkedBlockingQueue, take() विधि चेकों का उपयोग करते हैं javadoc

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

2

कई मामलों में जावडॉक्स का उल्लेख है कि कक्षा "निष्पक्ष" है, यानी अवरोध वितरित किया जाता है ताकि सभी धागे समान अवसर प्राप्त हो सकें। इसका जरूरी अर्थ यह नहीं है कि "उसी क्रम में हो जाता है"। यह देखने के लिए कि क्या निष्पक्षता और/या आदेश पर जानकारी है या नहीं, यह देखने के लिए अपने विशेष कतार कार्यान्वयन के लिए javadocs देखें। निष्पक्षता की

कम से कम ArrayBlockingQueue सूचित इस प्रकार है:

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

1

यह कार्यान्वयन पर निर्भर करता है, चाहे कोई वर्ग प्रतीक्षा निर्माता और उपभोक्ता धागे का आदेश देने के लिए वैकल्पिक निष्पक्षता नीति का समर्थन करता हो या नहीं। जैसेArrayBlockingQueue निष्पक्ष हो सकता है क्योंकि इसमें कन्स्ट्रक्टर ArrayBlockingQueue (int क्षमता, बूलियन मेला) है, लेकिन LinkedBlockingQueue cant।

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