"हाय, अमीगो!"

"हाय, ऋषि!"

"मैं आपको ऑब्जेक्ट क्लास के वेट , नोटिफिकेशन और नोटिफिकेशन सभी तरीकों से परिचित कराने जा रहा हूं।"

"आज हम सिर्फ उनसे परिचित होंगे, लेकिन हम बाद में वापस आएंगे और इस पर अधिक समय बिताएंगे।"

"ठीक है।"

"इन तरीकों का आविष्कार थ्रेड सिंक्रोनाइज़ेशन मैकेनिज़्म के हिस्से के रूप में किया गया था।"

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

"मुझे याद है। आप इसे सिंक्रोनाइज़्ड कीवर्ड का उपयोग करके करते हैं।"

"ठीक है। आमतौर पर, कोड कुछ इस तरह दिखेगा:"

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

"याद रखें कि यह कैसे काम करता है?"

"हाँ। यदि दो धागे एक साथ प्रिंट () विधि को बुलाते हैं, तो उनमें से एक सिंक्रनाइज़ लेबल वाले ब्लॉक में प्रवेश करेगा और मॉनिटर को लॉक कर देगा, जिससे यह हो जाता है कि दूसरा थ्रेड मॉनिटर के रिलीज़ होने तक प्रतीक्षा करेगा।"

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

"वैसे, आपने मॉनिटर नाम क्यों चुना?"

"एक मॉनिटर वह है जिसे आप आमतौर पर एक वस्तु कहते हैं जो व्यस्त या मुक्त स्थिति को संग्रहीत करता है।"

"और यह वह जगह है जहाँ प्रतीक्षा और सूचना के तरीके चलन में आते हैं।"

"वास्तव में, ये वास्तव में केवल दो तरीके हैं। अन्य इन तरीकों के सिर्फ अनुकूलन हैं।"

"अब आइए अपने सिर को चारों ओर लपेटें कि प्रतीक्षा पद्धति क्या है और हमें इसकी आवश्यकता क्यों है। "

"कभी-कभी किसी प्रोग्राम में ऐसी स्थितियाँ होती हैं जहाँ एक थ्रेड सिंक्रोनाइज़्ड कोड के एक ब्लॉक में प्रवेश करता है और मॉनिटर को लॉक कर देता है, लेकिन यह जारी नहीं रह सकता क्योंकि इसमें कुछ डेटा गायब है। उदाहरण के लिए, जिस फ़ाइल को प्रोसेस करने की आवश्यकता है, उसने डाउनलोड करना समाप्त नहीं किया है या ऐसा कुछ।"

"हम केवल फ़ाइल के डाउनलोड होने की प्रतीक्षा कर सकते हैं। आप बस लूप का उपयोग करके इसकी जांच कर सकते हैं। यदि फ़ाइल अभी तक डाउनलोड नहीं हुई है, तो एक या दो सेकंड के लिए सोएं, और डाउनलोड होने तक फिर से जांचें।"

"कुछ इस तरह:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

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

" इस समस्या को हल करने के लिए प्रतीक्षा () विधि का आविष्कार किया गया था। यह विधि थ्रेड को मॉनिटर जारी करने और फिर थ्रेड को «निलंबित" करने का कारण बनती है।

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

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

"फिर एक दूसरा धागा प्रवेश करेगा और निलंबित हो जाएगा, फिर एक तीसरा, और इसी तरह।"

"और कैसे एक धागा फिर से शुरू हो जाता है?"

"उसके लिए, एक दूसरी विधि है: सूचित करें।"

" मॉनिटर व्यस्त होने पर आप केवल मॉनीटर ऑब्जेक्ट की अधिसूचना / अधिसूचना सभी विधियों को कॉल कर सकते हैं, यानी केवल सिंक्रनाइज़ किए गए ब्लॉक के अंदर। InformAll विधि इस मॉनीटर ऑब्जेक्ट पर प्रतीक्षा कर रहे सभी धागे को जगाती है।"

" सूचित विधि एक यादृच्छिक थ्रेड को 'अनफ्रीज' करती है, लेकिन नोटिफिकेशन विधि इस मॉनिटर के सभी «जमे हुए» थ्रेड्स को अनफ्रीज करती है।"

"बहुत दिलचस्प। धन्यवाद, ऋषि।"

"प्रतीक्षा() विधि के अनुकूलन भी हैं:"

प्रतीक्षा करें () विधि व्याख्या
void wait(long timeout)
थ्रेड "फ्रीज" होता है, लेकिन यह स्वचालित रूप से "अनफ्रीज" होता है, प्रतीक्षा करने के बाद मिलीसेकंड की संख्या एक तर्क के रूप में विधि को पारित हो जाती है।
void wait(long timeout, int nanos)
थ्रेड "फ्रीज" होता है, लेकिन यह स्वचालित रूप से "अनफ्रीज" होता है, प्रतीक्षा करने के बाद नैनोसेकंड की संख्या एक तर्क के रूप में विधि को पारित कर दी जाती है।

"हम इसे टाइमआउट के साथ प्रतीक्षा भी कहते हैं। विधि सामान्य प्रतीक्षा की तरह काम करती है, लेकिन यदि निर्दिष्ट समय बीत चुका है और थ्रेड को जगाया नहीं गया है, तो यह स्वयं जाग जाता है।"