Java में Wait और Notify क्या है?



जावा में प्रतीक्षा करें और सूचित करें दो अंतिम विधियाँ हैं जो धागे को एक दूसरे के साथ संवाद करने की अनुमति देती हैं। यह लेख आपको विवरण के साथ मदद करेगा

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

मैं निम्नलिखित क्रम में विषयों पर चर्चा करूंगा:





चलो शुरू करें!

थ्रेड सिंक्रोनाइज़ेशन क्या है?

मल्टी-थ्रेडेड प्रोग्राम नियमित रूप से एक स्थिति के साथ आ सकते हैं जहां कई उसी संसाधन को प्राप्त करने का प्रयास जो कपटपूर्ण और चौंकाने वाले परिणाम उत्पन्न करता है। कई बार, एक से अधिक थ्रेड साझा संसाधन तक पहुँचने का प्रयास कर सकते हैं, आपको यह सुनिश्चित करने की आवश्यकता होती है कि संसाधन का उपयोग एक समय में केवल एक थ्रेड द्वारा किया जाएगा। यह प्रयोग करके किया जा सकता है जावा में सिंक्रनाइज़ेशन।



अब बात पोलिंग की। मतदान एक शर्त को बार-बार परखने की एक प्रक्रिया है जब तक कि यह सच न हो। की मदद से इस विधि को लागू किया जाता है यह जाँचने के लिए कि कोई विशेष शर्त सही है या नहीं। आप इस विधि का उपयोग थ्रेड्स के लिए कर सकते हैं, लेकिन यह विधि बहुत सारे CPU चक्रों को बर्बाद करती है कार्यान्वयन की प्रक्रिया को बहुत अक्षम बना देता है। इस प्रकार के कीड़ों से बचने के लिए, Java में Wait and Notify जैसे तरीके पेश किए जाते हैं।

प्रतीक्षा () और सूचना () के तरीके क्या हैं?

मल्टीथ्रेडिंग समस्या से निपटने के लिए, वेट एंड नोटिफाई जैसे तरीके उपयोग किया जाता है। ऑब्जेक्ट क्लास इन तीन अंतिम तरीकों का उपयोग करता है जो थ्रेड्स को संसाधन की बंद स्थिति के बारे में संवाद करने की अनुमति देता है। उन्हें पहरेदार ब्लॉक भी कहा जाता है।

ec2 linux उदाहरण के लिए फ़ाइलें स्थानांतरण

रुको()

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



रुको () विधि कसकर सिंक्रनाइज़ेशन लॉक के साथ एकीकृत है। यह सिंक्रनाइज़ेशन तंत्र से सीधे उपलब्ध नहीं सुविधा का उपयोग करके किया जाता है।

वाक्य - विन्यास:

सिंक्रनाइज़ (lockObject) {जबकि (स्थिति!) {lockObject.wait ()} // यहाँ कार्रवाई करें}

वर्तमान थ्रेड को ऑब्जेक्ट के मॉनीटर का स्वामी होना चाहिए। इसे केवल सिंक्रोनाइज़ की हुई विधि से ही पुकारा जाना चाहिए वरना यह एक अपवाद फेंक देगा।

सूचित करें()

इस विधि का उपयोग सूचना देने के लिए किया जाता है यह काम करने की जरूरत है। यह एक धागा है कि कहा जाता है उठता है रुको() एक ही वस्तु पर विधि।

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

वाक्य - विन्यास:

सिंक्रनाइज़ (लॉकऑब्जेक्ट) {// install_the_condition lockObject.notify () // कोई अतिरिक्त कोड यदि आवश्यक हो तो}

NotifyAll ()

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

Java में Wait () और Notify () का उपयोग क्यों और कैसे करें?

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

शर्त यह है कि एक आइटम के उत्पादन के बाद, उपभोक्ता धागा को अधिसूचित किया जाना चाहिए और इसी तरह, खपत निर्माता धागा को अधिसूचित करने के बाद। यह अंतर-सूत्रसंचारजावा में प्रतीक्षा और सूचना का उपयोग करके प्राप्त किया जाता है।

ध्यान दें : डब्ल्यू।ait और नहींtify के तरीके ऑब्जेक्ट क्लास में परिभाषित किए गए हैं, और उन्हें सिंक्रनाइज़ ब्लॉक के अंदर बुलाया जाना चाहिए।

उदाहरण

सार्वजनिक वर्ग थ्रेड 1 {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {थ्रेड 2 बी = नया थ्रेड 2 () बी.स्टार्ट () सिंक्रनाइज़ (बी) {कोशिश {System.out.println ('2 के पूरा होने की प्रतीक्षा ... ... ) b.wait ()} कैच (InterruptedException e) {e.printStackTrace ()} System.out.println ('कुल है:' + b.total)}}} क्लास थ्रेड 2 का विस्तार थ्रेड {int कुल @Override सार्वजनिक शून्य रन () {सिंक्रोनाइज़ (यह) {for (int i = 0 i)<=100 i++) { total += i } notify() }}}

ध्यान दें कि उपरोक्त उदाहरण में, थ्रेड 2 का एक ऑब्जेक्ट, जो कि बी है, सिंक्रनाइज़ है। यह बी गणना को पूरा करता है इससे पहले कि मुख्य धागा इसके कुल मूल्य को आउटपुट करता है।

आउटपुट:

यह हमें इस लेख के अंत में लाता है जहाँ हमने सीखा है जावा में प्रतीक्षा और सूचना पर।मुझे उम्मीद है कि उपर्युक्त सामग्री आपके बढ़ाने में मददगार साबित हुई ज्ञान। पढ़ते रहो, तलाशते रहो!

यह भी देखें 250,000 से अधिक संतुष्ट शिक्षार्थियों के एक नेटवर्क के साथ एक विश्वसनीय ऑनलाइन शिक्षण कंपनी, एडुरेका द्वारा, दुनिया भर में फैली हुई है। एडुर्का का जावा J2EE और SOA प्रशिक्षण और प्रमाणन पाठ्यक्रम उन छात्रों और पेशेवरों के लिए डिज़ाइन किया गया है जो जावा डेवलपर बनना चाहते हैं। पाठ्यक्रम आपको जावा प्रोग्रामिंग में एक शुरुआत देने के लिए डिज़ाइन किया गया है और आपको विभिन्न के साथ-साथ कोर और उन्नत जावा अवधारणाओं के लिए प्रशिक्षित करता है हाइबरनेट और स्प्रिंग की तरह।