2012-05-15 15 views
6

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

इसके अलावा, CountDownLatch से प्रतीक्षा() और प्रतीक्षा() के बीच क्या अंतर है?

धन्यवाद!

संपादित करें: मुझे लगता है कि मैं अपने प्रश्नों अलग तरीके से व्यक्त करने की जरूरत है: डॉक्स के अनुसार

का इंतजार() का कहना है:

कारण करने के लिए वर्तमान धागा इंतजार तक कुंडी शून्य हो जाने पर गिना गया है , जब तक धागा बाधित नहीं हो जाता है।

मेरे लिए यह इंतजार के बीच अंतर को देखने के लिए मुश्किल है() और इंतजार() - का इंतजार है() वास्तव में कवर के तहत प्रतीक्षा() का उपयोग कर रहा है, और लगता है एक अंतर्निहित notifyAll है() जब गिनती शून्य पर पहुंच गया।

मुझे क्या पूछना था, मुझे काउंटरडाउनलैच के बजाय जाने के बजाय प्रतीक्षा-नोटिफ़ाइली() तंत्र (मेरे अपने काउंटर वेरिएबल प्रोसेसिंग के साथ) का उपयोग क्यों नहीं करना चाहिए?

+1

यहां एक स्पष्ट अंतर है ... यदि थ्रेड बी कॉल करता है तो 'सूचित करें' (पहले 'थ्रेड से पहले' प्रतीक्षा करें '), थ्रेड ए हमेशा के लिए इंतजार करेगा; लेकिन अगर थ्रेड बी थ्रेड से पहले 'countDown() 'कॉल करता है तो कॉल' प्रतीक्षा() ', थ्रेड ए इंतजार किए बिना जारी रहेगा। – yshavit

उत्तर

9

वे निश्चित रूप से एक ही काम नहीं करते हैं: CountDownLatch केवल ईवेंट सिग्नल 0 पर पहुंचने पर सिग्नल होता है और यह स्वचालित रूप से ऐसा करता है, wait-notify आपको अपनी खुद की गिनती रखने की आवश्यकता है यदि आप एक ही व्यवहार प्राप्त करना चाहते हैं। एक ही व्यवहार को लागू करना अक्सर त्रुटि प्रवण होता है और यह सर्वोत्तम होता है कि आप इससे बचें (विशेष रूप से यदि आप समवर्ती प्रोग्रामिंग के लिए नए हैं)। CountDownLatch और wait-notify की तुलना में संतरे की तुलना में शायद ही कभी एक सेब है, यह एक स्वचालित ड्रिल और एलन रिंच की तुलना में अधिक है।

मैं तुम्हें notifyAll() और CountDownLatch, लेकिन notifyAll() का उपयोग किया है अकेले आप एक ही व्यवहार जब तक आप कितने घटनाएँ हुई हैं की गिनती रखा है नहीं देंगे पता नहीं है। CountDownLatch शायद आपके निश्चित कार्यक्रम के निष्पादन को फिर से शुरू करने से पहले कार्यों की निश्चित संख्या करने के लिए सबसे उपयुक्त है और उन कार्यों को पूरा करने के लिए प्रतीक्षा कर रहा है। यह विशेष रूप से सहायक होता है जब आपके पास निश्चित संख्या में थ्रेड (उदा। ThreadPool) कार्य की निश्चित संख्या निष्पादित करते हैं, लेकिन आपके धागे कार्य से कम होते हैं और आपको उनका पुन: उपयोग करना होता है। CountDownLatch के साथ आप आसानी से सभी कार्यों को पूरा करने के लिए प्रतीक्षा कर सकते हैं। मुझे नहीं पता कि आप एक ही व्यवहार को प्राप्त करने के लिए notifyAll() का उपयोग कैसे कर रहे हैं, लेकिन यदि आप हमें अधिक जानकारी प्रदान करते हैं तो हम यह पता लगा सकते हैं कि दोनों में से कौन सा बेहतर विकल्प है (निश्चित रूप से कुछ मामले हैं जहां waitNotify() अधिक उपयुक्त है) ।

wait() और await() के बीच के अंतर के संबंध में, मैं आपसे कुछ हद तक निराश हूं! प्रलेखन अवलोकन किया जा रहा किसी भी सवाल का कदम एक है:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

await()CountDownLatch जबकि wait() का एक वास्तविक समारोह Object से विरासत में मिली है। मैं अनुशंसा करता हूं कि आप दस्तावेज की जांच करें कि वे क्या करते हैं।

+0

आपको शायद वर्तमान दस्तावेज –

+0

@HunterMcMillen आह, हाँ ... यह एक अच्छा विचार है:) ... (प्रलेखन अद्यतन) – Kiril

+0

क्या मतलब है "थ्रेडपूल कार्य की एक निश्चित संख्या निष्पादित करता है, लेकिन आपके धागे कम हैं कार्यों की तुलना में और आपको उनका पुन: उपयोग करना होगा ", एन थ्रेड को कैसे कार्यान्वित करें एम एम कार्य (एन <एम)? क्या आप डेमो प्रदान करने में मदद कर सकते हैं? – coderz