वर्चुअल थ्रेड्स, जो Java 21 से फाइनल हैं, हल्के थ्रेड्स हैं जिन्हें JVM खुद कुछ ही carrier threads के छोटे पूल पर शेड्यूल करता है। जब कोई थ्रेड I/O पर ब्लॉक होता है तो वह unmount हो जाता है और अपना carrier छोड़ देता है, इसलिए दस लाख कनकरेंट टास्क भी बहुत सस्ते पड़ते हैं। व्यवहार में आप फिर से सीधा blocking कोड लिखते हैं और fixed pool वाले executor की जगह हर request पर एक थ्रेड इस्तेमाल करते हैं, और वर्चुअल थ्रेड्स को कभी pool नहीं करते क्योंकि एक बनाना लगभग मुफ्त है।
इंटरव्यूअर यह क्यों पूछते हैं
यह पिछले एक दशक में Java कनकरेंसी का सबसे बड़ा बदलाव है, इसलिए यह उन लोगों को अलग कर देता है जो प्लेटफॉर्म के साथ चलते हैं और उनसे जो Java 8 पर ही रुक गए। इंटरव्यूअर unmounting का व्यवहार सुनना चाहते हैं, यह कि वर्चुअल थ्रेड्स blocking I/O में मदद करते हैं CPU bound काम में नहीं, और यह कि उन्हें pool करना एक एंटीपैटर्न है। इसी से pinning, thread locals और अब आप कनकरेंसी कैसे सीमित करते हैं, ये सवाल खुलते हैं।
अपना जवाब कैसे स्ट्रक्चर करें
- इन्हें JVM द्वारा शेड्यूल होने वाले, सस्ते में बनने वाले थ्रेड्स के रूप में परिभाषित करें।
- blocking calls के दौरान carrier thread पर mounting और unmounting समझाएं।
- बताएं कि आपके कोड में क्या बदलता है: हर टास्क पर एक थ्रेड, कोई pooling नहीं।
- सीमाएं गिनाएं: CPU bound काम, pinning, thread local की लागत।
उदाहरण जवाब
वर्चुअल थ्रेड को ऑपरेटिंग सिस्टम नहीं, JVM शेड्यूल करता है, इसलिए इसकी लागत एक मेगाबाइट स्टैक की जगह कुछ सौ बाइट होती है। जब यह किसी socket read पर ब्लॉक होता है, तो यह अपने carrier platform thread से unmount हो जाता है और वह carrier कुछ और चलाने चला जाता है, फिर डेटा आने पर यह दोबारा mount हो जाता है। इसका मतलब है कि थ्रेड्स को pool करने की पुरानी वजह ही खत्म हो जाती है। मैं ऐसा executor इस्तेमाल करता हूं जो हर टास्क के लिए एक वर्चुअल थ्रेड बनाता है, और कोड सादा blocking कोड ही रहता है, जिसे callbacks की चेन के मुकाबले पढ़ना और डिबग करना कहीं आसान है। दो बातें मैं ध्यान में रखता हूं। पहली, CPU bound काम में इनसे कुछ नहीं मिलता, क्योंकि cores तो उतने ही हैं; फायदा I/O heavy request handling में है। दूसरी, fixed pool जो अनजाने में कनकरेंसी की एक सीमा लगा देता था, वह अब नहीं रही, इसलिए अगर मैं पचास connections वाले pool से डेटाबेस कॉल कर रहा हूं तो मैं आगे एक semaphore या खुद वह pool लगाता हूं, वरना दस हजार वर्चुअल थ्रेड्स एक साथ उस पर टूट पड़ेंगे।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- वर्चुअल थ्रेड अपने carrier को pin किस वजह से करता है, और क्या यह अब भी दिक्कत है?
- बिना thread pool के आप किसी downstream resource तक कनकरेंसी कैसे सीमित करेंगे?
- दस लाख थ्रेड्स होने पर thread locals ज्यादा महंगे क्यों पड़ते हैं?
Java डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें