प्रत्येक थ्रेड चलाने के लिए एक अलग सीपीयू पर चला सकते हैं जो एक देशी ओएस थ्रेड दिया जाएगा लेकिन जब से जावा है व्याख्या इन धागे फिर JVM के साथ बातचीत करने की आवश्यकता होगी और फिर बाइट कन्वर्ट करने के लिए कोड मशीन निर्देशों के लिए? क्या मैं सही हू ?
आप दो अलग-अलग चीजों को मिला रहे हैं; वीएम द्वारा किए गए जेआईटी और वीएम द्वारा प्रस्तुत थ्रेडिंग समर्थन। अंदर गहराई से, आप जो कुछ भी करते हैं वह कुछ प्रकार के देशी कोड में अनुवाद करता है। एक बाइट-कोड निर्देश जो थ्रेड का उपयोग करता है वह जेआईटीएड कोड से अलग नहीं है जो धागे तक पहुंचता है।
यदि हां, छोटे प्रोग्रामों की तुलना में जावा थ्रेड्स एक बड़ा फायदा नहीं होगा?
यहां छोटे परिभाषित करें। अल्पकालिक प्रक्रियाओं के लिए, हां, थ्रेडिंग उस बड़े अंतर को नहीं बनाता है क्योंकि आपका अनुक्रमिक निष्पादन पर्याप्त तेज़ है। ध्यान दें कि यह फिर से हल होने वाली समस्या पर निर्भर करता है। UI टूलकिट्स के लिए, कोई फर्क नहीं पड़ता कि एप्लिकेशन कितना छोटा है, यूआई उत्तरदायी रखने के लिए कुछ प्रकार के थ्रेडिंग/असीमित निष्पादन की आवश्यकता है।
थ्रेडिंग भी समझ में आता है जब आपके पास ऐसी चीजें हैं जो समानांतर में चल सकती हैं। एक सामान्य उदाहरण थ्रेड पर भारी आईओ और दूसरे में गणना करना होगा। आप वास्तव में अपनी प्रसंस्करण को अवरुद्ध नहीं करना चाहते हैं क्योंकि आपका मुख्य धागा आईओ कर रहा है।
एक बार हॉटस्पॉट इन दोनों निष्पादन रास्तों दोनों के रूप में अच्छा के रूप में देशी धागे हो सकता है संकलित? क्या मैं सही हू ?
मेरा पहला बिंदु देखें।
वास्तव में थ्रेडिंग एक रजत बुलेट नहीं है, जब "इस कोड को तेज़ी से जाने के लिए उपयोग धागे" की सामान्य गलतफहमी की बात आती है। थोड़ा सा पढ़ने और अनुभव आपकी सबसे अच्छी शर्त होगी। क्या मैं this awesome book की प्रति प्राप्त करने की अनुशंसा कर सकता हूं? :-)
@ संजय: वास्तव में अब मैं अपने प्रश्न को रेफ्रेम कर सकता हूं। अगर मेरे पास थ्रेड है जिसका कोड JIT'd नहीं किया गया है तो ओएस थ्रेड इसे निष्पादित करता है?
फिर मैं यह कहूंगा, थ्रेडिंग जेआईटी से एक पूरी तरह से अलग अवधारणा है। के सरल शब्दों में एक कार्यक्रम के निष्पादन को देखने के लिए कोशिश करते हैं:
जावा pkg.MyClass -> वीएम स्थित विधि चलाने के लिए -> लाइन द्वारा विधि लाइन के लिए बाइट-कोड को क्रियान्वित करने शुरू -> अपने मूल समकक्ष करने के लिए प्रत्येक बाइट-कोड अनुदेश कन्वर्ट -> अनुदेश ओएस द्वारा निष्पादित -> अनुदेश मशीन
द्वारा निष्पादित जब JIT में लात मारी है:
जावा पीकेजी।MyClass -> वीएम स्थित विधि जो JIT'ed कर दिया गया है चलाने के लिए -> कि विधि के लिए जुड़े देशी कोड का पता लगाने -> अनुदेश ओएस द्वारा निष्पादित -> अनुदेश मशीन द्वारा निष्पादित
जैसा कि आप देख सकते हैं, चाहे आप जिस मार्ग का पालन करते हैं, भले ही वीएम निर्देश को किसी समय पर अपने मूल समकक्ष को मैप किया जाना चाहिए। क्या उस देशी कोड को फिर से उपयोग के लिए संग्रहीत किया जाता है या अगर एक अलग चीज़ (ऑप्टिमाइज़ेशन, याद है?) दूर फेंक दिया जाता है।
इसलिए आपके सवाल का जवाब देना, जब भी आप कोड सूत्रण लिखें, उसे मूल कोड में अनुवाद किया है और ओएस द्वारा चलाते हैं। चाहे वह अनुवाद मक्खी पर किया गया हो या उस समय उस बिंदु पर देखा गया एक पूरी तरह से अलग मुद्दा है।
रान के लिए खेद है, यह जवाब अपेक्षा से काफी अधिक है। ;-) –
@ संजय: अगर मुझे यह सही लगता है तो पहली बार थ्रेड निष्पादित होने से पहले भी जेआईटी किया जाएगा?Essesntially JVM पहले स्वतंत्र धागे और निष्पादन के लिए ओएस थ्रेड दोनों के लिए जेआईटी करता है? – Geek
@ गीक: जैसा कि पहले ही उल्लेख किया गया है, जेआईटी और थ्रेड निष्पादन दो ऑर्थोगोनल मुद्दे हैं। हां, यह काफी संभव है कि कोड का टुकड़ा निष्पादित करने वाला है, पहले ही वीएम द्वारा जेआईटी किया जा सकता है। इसके अलावा, निष्पादन की कोई * अग्रेषण * नहीं है। जब थ्रेड ऑब्जेक्ट पर 'प्रारंभ()' विधि कहा जाता है, तो एक नया मूल ओएस थ्रेड बनाया जाता है, "जावा थ्रेड" और "ओएस थ्रेड" के बीच कोई अग्रेषण नहीं होता है। इसके अलावा, जेआईटी अनिवार्य नहीं है। ऐसा हो सकता है कि आपका धागा वर्तमान में कोड निष्पादित करेगा जो कि JIT'ed नहीं है। जेआईटी एक प्रदर्शन विशिष्ट अनुकूलन है। –