या तो उन्हें वर्चुअल थ्रेड्स वाले executor को सौंप दें और नतीजे join करें, या CompletableFuture से compose करें, जहां supplyAsync किसी स्पष्ट executor पर चले और इंतजार allOf से हो। पूरे operation पर timeout रखें, आंशिक नाकामी को सोच समझकर संभालें, और एक के फेल होने पर बाकी को cancel कर दें। task scope वाली structured concurrency ठीक यही शक्ल जताती है और subtasks की उम्र उस block से बांध देती है, हालांकि यह अब भी preview API है।
इंटरव्यूअर यह क्यों पूछते हैं
किसी service में fan out और join सबसे आम कनकरेंसी शक्ल है, और इंटरव्यूअर देखना चाहते हैं कि आप बेरौनक हिस्से कैसे संभालते हैं: काम किस executor पर चलता है, एक call फेल या अटक जाए तो क्या होता है, और बाकी calls cancel होती हैं या नहीं। यह जानना कि डिफॉल्ट asynchronous pool वही साझा common pool है, और अपना executor देना क्यों मायने रखता है, असली इस्तेमाल को ट्यूटोरियल वाले इस्तेमाल से अलग कर देता है।
अपना जवाब कैसे स्ट्रक्चर करें
- एक तरीका चुनें और बताएं कि tasks असल में कहां चलते हैं।
- नतीजे जोड़ें और कुल timeout रखें।
- आंशिक नाकामी की नीति साफ साफ तय करें।
- आधुनिक और साफ शक्ल के तौर पर structured concurrency का जिक्र करें।
उदाहरण जवाब
वर्चुअल थ्रेड्स के साथ यह आसान हो गया: मैं ऐसा executor खोलता हूं जो हर task के लिए एक थ्रेड बनाता है, तीनों calls सौंपता हूं, फिर हर future join करता है। पढ़ने में यह क्रमवार लगता है, पर calls आपस में ओवरलैप करती हैं, और हर एक का अपना client timeout है। पुरानी codebase पर हूं तो मैं supplyAsync के साथ CompletableFuture लेता हूं, और हमेशा अपना executor पास करता हूं, क्योंकि डिफॉल्ट वह common ForkJoinPool है जो CPU काम के हिसाब से sized है और पूरी process में साझा होता है। फिर इंतजार के लिए allOf, और जोड़े हुए future पर एक timeout ताकि कोई अटकी dependency request को हमेशा के लिए न रोक सके। जिस हिस्से पर मैं सबसे ज्यादा सोचता हूं वह है आंशिक नाकामी: अगर recommendations वाली call फेल हो जाए, तो क्या मैं पूरा पेज फेल करूं या उसके बिना render करूं? आमतौर पर जवाब है degrade करो, तो उस future पर exceptionally handler खाली list लौटा देता है, जबकि जरूरी calls की नाकामी आगे बढ़ती है। structured concurrency इसे कहीं बेहतर जताती है, क्योंकि एक scope सारे subtasks join करता है और एक के फेल होने या deadline बीतने पर बाकी cancel कर देता है, और जहां preview API चलने लायक है वहां मैं इसे इस्तेमाल करता हूं।
जल्दी ही यह इंटरव्यू देने जा रहे हैं? GhostPilot आपकी लाइव कॉल सुनता है, सवाल पूछे जाते ही उसे पकड़ लेता है, और रियल-टाइम में एक स्ट्रक्चर्ड जवाब आपकी स्क्रीन पर डाल देता है। अगले मॉक में इसे आजमाएं, या ले लें एक $29 Session Pass, कोई सब्सक्रिप्शन नहीं, असली इंटरव्यू के लिए।
देखें यह कैसे काम करता हैफॉलो-अप सवाल जिनकी उम्मीद रखें
- अगर आप executor न दें तो supplyAsync कौन सा executor इस्तेमाल करता है?
- एक call फेल होने पर आप बाकी calls कैसे cancel करते हैं?
- thenApply और thenCompose में क्या फर्क है?
Java डेवलपर के और सवाल
आपका इंटरव्यूअर इसका अपना वर्ज़न पूछेगा। फ्री Question Predictor में अपना असली जॉब डिस्क्रिप्शन पेस्ट कीजिए और वो 20 सवाल पाइए जो उस रोल में सबसे ज्यादा पूछे जाने की संभावना है, साथ में यह भी कि हर सवाल असल में क्या टटोल रहा है।
मेरे सवाल प्रेडिक्ट करें