2012-04-14 9 views
15

के लिए वास्तविक जीवन उदाहरण हमारे प्रशिक्षकों में से एक उदाहरण दिया गया है जब वह काउंटरडाउनलैच और साइक्लिकबैरियर के बीच अंतर समझा रहा था।काउंटीडाउनलैच और साइक्लिकबैरियर

CountDownLatch: मान लीजिए कि 10 लोगों द्वारा एक पत्थर उठाया जा सकता है ताकि आप आने वाले सभी 10 इंतजार कर सकें। तब केवल आप पत्थर उठा सकते हैं।

CyclicBarrier: यदि आप एक पिकनिक जा रहे हैं, और आपको पहले कुछ सामान्य बिंदुओं पर मिलना होगा जहां से आप सभी अपनी यात्रा शुरू करेंगे।

यदि कोई इन टिप्पणियों से सहमत है तो कृपया मुझे कुछ विवरण दें।

मैंने इन दोनों कक्षाओं के लिए पहले से ही सूर्य एपीआई पढ़ा है। लेकिन मुझे कुछ और व्याख्या की जरूरत है।

+0

यह http://mkorytin.blogspot.in/2011/07/cyclicbarrier-countdownlatch-and.html और http://shazsterblog.blogspot.in/2011/12/comparison-of-countdownlatch.html देखें। कुछ बहुत ही अच्छी समझ और उदाहरण –

+0

एक और लिंक है कि आप उपयोगी लग सकते है http://adnanfaizan.blogspot.in/2013/10/countdownlatch-tutorial-class-of-java.html –

+0

@Sunny यह अब पुराने सवाल लेकिन यह मेरे लिए नया है। क्या आप 2 प्रश्नों का उत्तर दे सकते हैं (1)। क्या आपका साइक्लिक बैरियर उदाहरण (पिकनिक) सही है ?? प्रश्न 2)। इस चक्रीय बैरियर उदाहरण में यदि पिकनिक के लिए 10 लोग जा रहे हैं तो उन्हें कुछ आम बिंदु पर मिलना होगा जहां सभी अपनी यात्रा फिर से शुरू करेंगे। क्या क्लब (या गंतव्य) तक पहुंचने से पहले सभी धागे के लिए इस यात्रा में कई आम बिंदु हो सकते हैं। –

उत्तर

29

मुख्य अंतर यह है कि CountDownLatch धागे को वेटर्स और आने वालों में अलग करता है जबकि CyclicBarrier का उपयोग करने वाले सभी थ्रेड दोनों भूमिकाएं करते हैं।

  • एक लच के साथ, वेटर्स अंतिम आने वाले धागे तक पहुंचने की प्रतीक्षा करते हैं, लेकिन आने वाले धागे स्वयं प्रतीक्षा नहीं करते हैं।
  • बाधा के साथ, सभी धागे आते हैं और फिर आने वाले अंतिम इंतजार के लिए प्रतीक्षा करते हैं।

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

+0

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

+0

उदाहरण पत्थर को उठाने के लिए 10 लोग उपलब्ध होने पर उदाहरण एक समन्वयक जांच की तरह होना चाहिए। क्या मैं सही हू?? –

+4

@ एसएएम - गलत, केवल थ्रेड जो लच ब्लॉक पर 'प्रतीक्षा' कहते हैं, जब तक कि उलटी गिनती शून्य तक न पहुंच जाए। 'गिनडाउन' कॉल करने वाले थ्रेड ब्लॉक नहीं होते हैं। –

4

केस 1 का प्रयोग करें मान लीजिए कि आपने एक बड़ा काम 10 छोटे कार्य में विभाजित किया है, प्रत्येक एक थ्रेड। काम करने पर विचार करने से पहले आपको उस धागे से 10 कार्यों के अंत का इंतजार करना होगा।

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

केस 2 का प्रयोग करें मान लीजिए कि आपने एन थ्रेड पर वितरित एन * एम कार्यों में एक बड़ी नौकरी विभाजित की है। मीटर एक मैट्रिक्स पंक्ति से मेल खाता है और आपके पास प्रत्येक पंक्ति के लिए गणना करने के लिए कुल मिलाकर है। उस स्थिति में, प्रत्येक कार्य समाप्त होने के बाद धागे को सिंक्रनाइज़ किया जाना चाहिए ताकि पंक्ति के लिए कुल गणना हो। उस स्थिति में, CyclicBarrier थ्रेड एन की संख्या के साथ आरंभ किया जाता है, प्रत्येक पंक्ति गणना (वास्तव में एम बार) के अंत की प्रतीक्षा करने के लिए उपयोग किया जाता है।

दोनों की तुलना करने के CountDownLatch केवल 1 समय इस्तेमाल किया जा माना जाता है और एक CyclicBarrier रूप में कई बार इस्तेमाल किया जा सकता के रूप में एल्गोरिथ्म धागे का एक सेट के लिए एक तुल्यकालन बिंदु की आवश्यकता है।

4

CyclicBarrier पुन: प्रयोज्य है, इसलिए यह रेसिंग टूर की तरह है जहां हर कोई दौरे के अगले चरण पर आगे बढ़ने से पहले एक रास्ते पर मिलता है।

+0

एक 'काउंटरडाउनलैच' उदाहरण पर चर्चा की गई है [यहां] (http://stackoverflow.com/a/3588523/230513)। – trashgod

0

CountDownLatch: हम अपने सूत्र के सभी

कुछ + उलटी गिनती करना चाहते हैं तो

ताकि अन्य इंतजार कर (गिनती शून्य तक पहुँचने के लिए) धागे कर सकते हैं आगे बढ़ें, हम उलटी गिनती का उपयोग कर सकते हैं। अन्य थ्रेड पर latch.countdown (तक पहुँचने के लिए) सभी पूर्व धागे, जो वास्तव में उलटी गिनती इस स्थिति में पर जा सकते हैं, लेकिन कोई गारंटी नहीं कि लाइन latch.countdown (के बाद संसाधित है किया) प्रतीक्षा करने के बाद किया जाएगा लेकिन यह एक है गारंटी है कि अन्य प्रतीक्षा धागे केवल latch.await() शून्य तक पहुंचने के बाद ही शुरू हो जाएगा।

CyclicBarrier: हम

हमारे सभी धागा कुछ + आम बिंदु पर इंतजार कर + कर कुछ

चाहते हैं (प्रत्येक का इंतजार धागे ले जाने के लिए के लिए कॉल प्रतीक्षा समय कम हो जाएगा आगे पर)

CyclicBarrier कार्यक्षमता latch.countdown बुला() latch.await() सब से के बाद से केवल एक बार CountDownLatch द्वारा प्राप्त किया जा सकता धागे

लेकिन फिर आप रीसेट/countdownlatch पुन: उपयोग नहीं कर सकते।

सर्वश्रेष्ठ उदाहरण जहां मैंने साइक्लिकबैरियर का उपयोग किया था, कई कैश (कई धागे से गर्म) शुरू करना और फिर आगे की प्रक्रिया शुरू करना है, और मैं सिंक में फिर से अन्य कैश को फिर से शुरू करना चाहता था।

15

एक काल्पनिक थिएटर में,

यह Mutex कहा जाता है, तो केवल एक ही व्यक्ति है, तो लोगों के एन संख्या play.If किसी को भी छोड़ देखने के लिए अनुमति देने के लिए खेलने
यह सेमाफोर कहा जाता है को देखने के लिए अनुमति देते हैं नाटक के दौरान रंगमंच तो दूसरे व्यक्ति को खेलने के लिए अनुमति दी जा सकती है।
यह CountDownLatch कहा जाता है अगर कोई भी जब तक हर व्यक्ति theater.Here प्रत्येक व्यक्ति स्वेच्छा थिएटर छोड़ने के लिए गया है खाली प्रवेश करने की अनुमति।
यह Cyclicbarrier कहा जाता है, तो थिएटर शुरू नहीं होगी जब तक हर व्यक्ति को थिएटर में दर्ज करें। यहां शोमैन तब तक शो शुरू नहीं कर सकता जब तक कि सभी व्यक्ति सीट में प्रवेश न करें। एक बार खेलने खत्म ही बाधा अगले शो

यहाँ पर लागू होगा, व्यक्ति धागा है, प्ले संसाधन है।

3

सैद्धांतिक अंतर:

CountDownLatch में, मुख्य धागे उनके निष्पादन पूरा करने के लिए अन्य थ्रेड के लिए इंतजार कर रहा है। साइक्लिकबैरियर में, कार्यकर्ता धागे एक दूसरे के निष्पादन को पूरा करने के लिए प्रतीक्षा करते हैं।

एक बार गिनती तक पहुंचने के बाद आप उसी काउंटरडाउनलैच इंस्टेंस का पुन: उपयोग नहीं कर सकते हैं और दूसरी ओर लच खुला है, दूसरी तरफ बाइकियर को तोड़ने के बाद बैरियर को रीसेट करके साइक्लिकबैरियर का पुन: उपयोग किया जा सकता है।

वास्तविक जीवन उदाहरण: -

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

यहां प्रबंधक धागा मुख्य धागे के रूप में काम करता है और विकास टीम वर्कर थ्रेड के रूप में काम करती है। प्रबंधक धागा अपने कार्य को पूरा करने के लिए विकास टीम थ्रेड के लिए इंतजार कर रहा है।

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

यहां प्रबंधक धागा मुख्य धागे के रूप में काम करता है और विकास टीम वर्कर थ्रेड के रूप में काम करती है। विकास टीम धागे अपने कार्य को पूरा करने के बाद अन्य विकास टीम धागे की प्रतीक्षा करते हैं।

5

असली दुनिया उदाहरण मैं देख सकता हूं कि सभी उत्तरों वास्तव में एक वास्तविक उदाहरण गायब हैं। इन कक्षाओं में एक सॉफ्टवेयर दायरे

  1. CountDownLatch एक थ्रेड डाउनलोड प्रबंधक में इस्तेमाल किया जा सकता है कि कैसे में के रूप में। डाउनलोड प्रबंधक फ़ाइल के प्रत्येक भाग को एक साथ डाउनलोड करने के लिए एकाधिक थ्रेड शुरू करेगा। (बशर्ते सर्वर डाउनलोड करने के लिए एकाधिक थ्रेड का समर्थन करता है)। यहां प्रत्येक थ्रेड एक तत्काल लच की उलटी गिनती विधि को कॉल करेगा। आखिर धागे निष्पादन, धागा above..But के रूप में मान फाइलों से डाउनलोड कर रहे हैं एक साथ एक फ़ाइल

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

  3. कई बार धन्यवाद किया जा सकता है

कृपया मुझे सही कर अगर कुछ भी ठीक नहीं।

0

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

मैं एक कार्यकर्ता जिनमें से प्रत्येक शुरू को स्कैन करके इसकी में सौंपा काम फ़ीड पैदा करते हैं। दोनों कर्मचारी अपने नौकरी फ़ीड में प्राथमिक कौशल खोज से शुरू करेंगे।

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