wait() बनाम sleep() Java में: मल्टीथ्रेडिंग के दिग्गजों की लड़ाई
\n\nकल्पना करें कि आप एक ऑर्केस्ट्रा के संचालक हैं। आपके पास वायलिन वादक (थ्रेड) हैं जिन्हें समन्वित रूप से बजाना है, लेकिन कभी-कभी उन्हें तब तक इंतजार करना पड़ता है जब तक कि अन्य अपना भाग पूरा न कर लें। Java में ऐसे ठहरावों को प्रबंधित करने के लिए दो शक्तिशाली उपकरण हैं: wait() और sleep()। पहली नज़र में वे समान लगते हैं - दोनों ही थ्रेड को कुछ समय के लिए "स्थिर" कर देते हैं। लेकिन वास्तव में ये पूरी तरह से अलग तंत्र हैं, और इन्हें भ्रमित करना deadlock या race condition पाने का निश्चित तरीका है।
यह लेख मल्टीथ्रेडिंग के जंगल में आपका मार्गदर्शक है। हम केवल अंतरों को सूचीबद्ध नहीं करेंगे, बल्कि उन्हें जीवंत उदाहरणों के साथ समझाएंगे, ताकि आप हमेशा याद रखें: sleep एक ठहराव है, जबकि wait संसाधन को मुक्त करना है। चलिए शुरू करते हैं!
\n\nsleep() क्या है? (Thread.sleep)
\n\nविधि Thread.sleep(मिलीसेकंड) वर्तमान थ्रेड को एक निश्चित समय के लिए "सुलाने" का सबसे सरल तरीका है। थ्रेड बस आराम करता है, वस्तुओं से लॉक हटाए बिना। यह एक आलसी बिल्ली की तरह है जो सोफे पर झपकी लेती है, लेकिन अपने पंजे से खिलौने को पकड़े रहती है।
sleep() के बारे में महत्वपूर्ण तथ्य:
- \n
- यह
Threadवर्ग की एक स्टैटिक विधि है। \n - थ्रेड अपने द्वारा धारित मॉनिटर (लॉक) को मुक्त नहीं करता। \n
- टाइमर समाप्त होने के बाद, थ्रेड Runnable (निष्पादन के लिए तैयार) स्थिति में आ जाता है। \n
- यह
InterruptedExceptionफेंक सकता है। \n
एक सरल उदाहरण:
\npublic class SleepExample {\n public static void main(String[] args) throws InterruptedException {\n System.out.println("शुरू कर रहे हैं: " + System.currentTimeMillis());\n Thread.sleep(2000); // 2 सेकंड सोते हैं\n System.out.println("जाग गए: " + System.currentTimeMillis());\n }\n}\n\nपरिणाम: दो आउटपुट के बीच ठीक 2 सेकंड का अंतर होगा। थ्रेड बस इंतजार कर रहा था, कुछ नहीं कर रहा था।
\n\nwait() क्या है? (Object.wait)
\n\nविधि wait() अब केवल एक ठहराव नहीं है, बल्कि एक अंतर-थ्रेड संचार तंत्र है। यह Object वर्ग में परिभाषित है, और इसे केवल सिंक्रोनाइज़्ड ब्लॉक (synchronized) के अंदर ही कॉल किया जा सकता है। जब कोई थ्रेड wait() कॉल करता है, तो वह:
- \n
- ऑब्जेक्ट के मॉनिटर को मुक्त करता है (अर्थात लॉक छोड़ देता है)। \n
- WAITING या TIMED_WAITING (यदि टाइमआउट निर्दिष्ट है) स्थिति में चला जाता है। \n
- तब तक प्रतीक्षा करता है जब तक कोई अन्य थ्रेड उसी ऑब्जेक्ट पर
notify()याnotifyAll()कॉल न करे। \n
यह ऐसा है जैसे आप कहें: "मैं कांटा रख रहा हूँ और तब तक प्रतीक्षा करूंगा जब तक मुझे दूसरा व्यंजन नहीं मिल जाता।" आप केवल सो नहीं रहे हैं - आप दूसरे के लिए मेज पर जगह खाली कर रहे हैं।
\n\nमूल उदाहरण:
\npublic class WaitNotifyExample {\n private static final Object lock = new Object();\n\n public static void main(String[] args) throws InterruptedException {\n Thread waiter = new Thread(() -> {\n synchronized (lock) {\n try {\n System.out.println("वेटर थ्रेड प्रतीक्षा कर रहा है...");\n lock.wait(); // lock छोड़ता है और प्रतीक्षा करता है\n System.out.println("वेटर थ्रेड को सूचना मिल गई!");\n } catch (InterruptedException e) {\n Thread.currentThread().interrupt();\n }\n }\n });\n\n Thread notifier = new Thread(() -> {\n synchronized (lock) {\n System.out.println("शेफ थ्रेड खाना बना रहा है...");\n try {\n Thread.sleep(1000); // खाना पकाने का अनुकरण\n } catch (InterruptedException e) {\n Thread.currentThread().interrupt();\n }\n lock.notify(); // प्रतीक्षारत थ्रेड को जगाता है\n System.out.println("शेफ ने वेटर को सूचित कर दिया!");\n }\n });\n\n waite