मानते हैं कि आप Thread.State.BLOCKED
और Thread.State.WAITING
(यानी t.getState()
द्वारा लौटाए गए) के बीच अंतर पूछ रहे हैं?
मुझे पता है कि क्या JVM स्तर पर अंतर नहीं है चाहते हैं और सीपीयू
नीचे से ऊपर कार्य पर क्या अंतर है, वहाँ हार्डवेयर स्तर पर कोई अंतर नहीं है क्योंकि उन राज्यों हार्डवेयर अवधारणाओं नहीं हैं । प्रतीक्षा धागे और ब्लॉक किए गए धागे CPU संसाधनों का उपयोग नहीं करते हैं। यदि कोई सीपीयू आपके प्रोग्राम का कोड नहीं चला रहा है, तो यह या तो चल रहा कोड है जो किसी अन्य प्रक्रिया से संबंधित है या ऑपरेटिंग सिस्टम में है; अन्यथा यह एक निष्क्रिय स्थिति में है जिसका जावा या जेवीएम से कोई लेना देना नहीं है।
फिर, आपने एक परत - ऑपरेटिंग सिस्टम छोड़ दिया। सभी व्यावहारिक जेवीएम ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए थ्रेडिंग प्राइमेटिव्स का उपयोग कर जावा थ्रेड को कार्यान्वित करते हैं।
ऑपरेटिंग सिस्टम में, प्रत्येक थ्रेड को उस ऑब्जेक्ट द्वारा दर्शाया जाता है जिसमें ओएस को थ्रेड के बारे में जानने की सारी जानकारी होती है। जब कुछ CPU पर थ्रेड चल रहा है, तो ऑब्जेक्ट ओएस को बताता है कि कौन सी सीपीयू और कितनी देर चल रही है, आदि। जब कोई थ्रेड नहीं चल रहा है, तो ऑब्जेक्ट में CPU स्थिति का एक स्नैपशॉट होता है जिसे पुनर्स्थापित करने के लिए पुनर्स्थापित किया जाना चाहिए थ्रेड एक बार और अधिक रन।
ओएस में प्रत्येक थ्रेड ऑब्जेक्ट कई कंटेनर में से एक में पाया जा सकता है: एक कंटेनर है जिसमें सभी चलने वाले धागे का सेट होता है, और अन्य कंटेनर (ज्यादातर कतार) होते हैं जो थ्रेड नहीं चलते हैं।
आमतौर पर रन कतार चलाने के लिए तैयार धागे को पकड़ते हैं, लेकिन जो सीपीयू चलाने के लिए प्रतीक्षा कर रहे हैं। फिर प्रत्येक mutex (a.k.a. के लिए एक कतार है, ताला) कि धागे कि म्युटेक्स, प्रत्येक हालत चर कि धागे रखती है के लिए एक कतार है कि है कि हालत के बारे में notify()
घ इंतजार कर रहे हैं, आदि
जब भी कुछ धागा एक म्युटेक्स पत्ते दर्ज करने के लिए इंतजार कर रखती है, ऑपरेटिंग सिस्टम उस म्यूटेक्स के लिए कतार को देखता है। यदि कतार खाली नहीं है, तो यह उस कतार से धागा उठाता है और इसे रन कतार में ले जाता है। जब भी कुछ थ्रेड o.notify()
पर कॉल करते हैं, तो ओएस उस स्थिति चर के कतार से एक थ्रेड चुनता है और इसे रन कतार में ले जाता है या, यदि प्रोग्राम notifyAll()
पर कॉल करता है, तो ओएस उस कतार से सभी कतारों को रन कतार में ले जाता है।
तो, ओएस स्तर पर, यह नहीं इतना क्या राज्य में धागा है का सवाल है, के रूप में यह एक सवाल जिनमें से कतार में धागा है।
अंत में , जेवीएम स्तर पर, कहने के लिए बहुत कुछ नहीं बचा है क्योंकि जेवीएम ओएस को सभी कामों को बहुत अधिक करने देता है। जावा दो राज्यों, रनिंग और प्रतीक्षा करने के लिए केवल एक सुविधा के रूप में, प्रोग्रामर प्रदान करता है, यदि यह आपके लिए अंतर जानने के लिए उपयोगी है। (संकेत: जब आप प्रोग्राम के डंप को देख रहे हों, और यह पता लगाने की कोशिश कर रहा है कि उस समय प्रत्येक थ्रेड क्या कर रहा था।)
बहुत बहुत धन्यवाद। यह मुद्दा मेरे कई दिन .. धन्यवाद आपका जवाब .. मैं समझ गया हूँ .. – Timi