wait() - थ्रेड इस मॉनिटर का ओनरशिप छोड़ देता है और तब तक वेट करता है जब तक कोई अन्य थ्रेड notify() या notifyAll() मेथड के माध्यम से इस ऑब्जेक्ट के मॉनिटर पर वेट कर रहे थ्रेड्स को जगाता नहीं है। थ्रेड तब तक वेट करता है जब तक यह मॉनिटर का ओनरशिप फिर से प्राप्त नहीं कर लेता और एक्जीक्यूशन जारी नहीं रखता।
sleep() - यह मेथड वर्तमान में एक्जीक्यूट हो रहे थ्रेड को निर्दिष्ट मिलीसेकंड्स के लिए स्लीप (अस्थायी रूप से एक्जीक्यूशन रोकना) का कारण बनता है। थ्रेड किसी भी मॉनिटर का ओनरशिप नहीं खोता। यह करंट थ्रेड को निर्दिष्ट समय के लिए "नॉट रननेबल" स्टेट में भेज देता है।
| क्र.सं. | मुख्य बिंदु | Wait | Sleep |
|---|---|---|---|
| 1 | क्लास | wait() मेथड Object क्लास से संबंधित है | sleep() मेथड Thread क्लास से संबंधित है |
| 2 | लॉक रिलीज | wait() ऑब्जेक्ट पर लॉक रिलीज कर देता है | यह ऑब्जेक्ट पर लॉक रिलीज नहीं करता |
| 3 | कॉलिंग कॉन्टेक्स्ट | wait() को ऑब्जेक्ट पर ही कॉल किया जा सकता है | sleep() को थ्रेड पर कॉल किया जा सकता है |
| 4 | वेक-अप कंडीशन | ऑब्जेक्ट से notify(), notifyAll() कॉल होने तक | कम से कम समय समाप्त होने या interrupt कॉल होने तक |
| 5 | स्प्यूरियस वेकअप्स | प्रोग्राम को स्प्यूरियस वेकअप्स मिल सकते हैं | इसे स्प्यूरियस वेकअप्स नहीं मिलते |
उदाहरण
synchronized(lockedObject) {
while(condition == true) {
lockedObject.wait(); // lockedObject लॉक रिलीज करता है
}
Thread.sleep(100); // करंट थ्रेड को स्लीप पर डालता है
}
महत्वपूर्ण नोट्स
- wait() हमेशा synchronized ब्लॉक/मेथड के अंदर ही कॉल करना चाहिए, अन्यथा IllegalMonitorStateException थ्रो होता है
- sleep() कहीं भी कॉल किया जा सकता है, इसके लिए सिंक्रोनाइजेशन की आवश्यकता नहीं होती
- स्प्यूरियस वेकअप के कारण wait() को हमेशा while लूप में उपयोग करना चाहिए
- दोनों मेथड्स InterruptedException थ्रो कर सकते हैं जिसे हैंडल करना आवश्यक है