सही डिफ़ॉल्ट विकल्प आपके थ्रो सूची में InterruptedException जोड़ रहा है। एक बाधा इंगित करती है कि एक और धागा आपके धागे को समाप्त होने की कामना करता है। इस अनुरोध का कारण स्पष्ट नहीं किया गया है और यह पूरी तरह से प्रासंगिक है, इसलिए यदि आपके पास कोई अतिरिक्त ज्ञान नहीं है, तो आपको यह मान लेना चाहिए कि यह केवल एक अनुकूल शटडाउन है, और कुछ भी जो उस शटडाउन से बचता है वह एक गैर-अनुकूल प्रतिक्रिया है।
जावा ने बेतरतीब ढंग से InterruptedException's को फेंक नहीं दिया, सभी सलाह आपके आवेदन को प्रभावित नहीं करेगी लेकिन मैं ऐसे मामले में चला गया हूं, जहां "निगल" रणनीति के बाद डेवलपर की स्थिति बहुत असुविधाजनक हो गई है। एक टीम ने परीक्षणों का एक बड़ा सेट विकसित किया था और थ्रेड का उपयोग किया था। अब हमने अपने CI सर्वर में परीक्षण चलाना शुरू कर दिया, और कभी-कभी कोड में दोषों के कारण स्थायी प्रतीक्षा में फंस जाते। स्थिति को बदतर बनाने के लिए, जब सीआई की नौकरी को रद्द करने का प्रयास किया गया तो यह कभी बंद नहीं हुआ क्योंकि थ्रेड.इंटरप्ट जो कि परीक्षण को निरस्त करने का इरादा था, नौकरी को निरस्त नहीं करता था। हमें बॉक्स में लॉग इन करना था और मैन्युअल रूप से प्रक्रियाओं को मारना था।
इतनी लंबी कहानी छोटी है, अगर आप बस InterruptedException फेंकते हैं तो आप डिफ़ॉल्ट इरादे से मेल खा रहे हैं कि आपका धागा समाप्त होना चाहिए। यदि आप अपने फेंक सूची में InterruptedException नहीं जोड़ सकते हैं, तो मैं इसे RuntimeException में लपेटूंगा।
एक बहुत ही तर्कसंगत तर्क दिया जाना चाहिए कि InterruptedException स्वयं एक RuntimeException होनी चाहिए, क्योंकि यह एक बेहतर "डिफ़ॉल्ट" हैंडलिंग को प्रोत्साहित करेगी। यह केवल एक RuntimeException नहीं है, क्योंकि डिज़ाइनर एक स्पष्ट नियम से चिपके हुए हैं कि RuntimeException आपके कोड में एक त्रुटि का प्रतिनिधित्व करना चाहिए। चूंकि एक InterruptedException सीधे आपके कोड की किसी त्रुटि से उत्पन्न नहीं होती है, इसलिए यह नहीं है। लेकिन वास्तविकता यह है कि अक्सर एक InterruptedException उत्पन्न होती है क्योंकि आपके कोड में एक त्रुटि है, (यानी अंतहीन लूप, डेड-लॉक), और Interrupt उस त्रुटि से निपटने के लिए कुछ अन्य थ्रेड विधि है।
यदि आप जानते हैं कि तर्कसंगत सफाई की जानी है, तो इसे करें। यदि आप इंटरप्ट के लिए एक गहरा कारण जानते हैं, तो आप अधिक व्यापक हैंडलिंग ले सकते हैं।
इसलिए सारांश में, इस सूची को संभालने के लिए आपके विकल्पों का पालन करना चाहिए:
- डिफ़ॉल्ट रूप से, थ्रो में जोड़ें।
- यदि थ्रो में जोड़ने की अनुमति नहीं है, तो RuntimeException (e) को फेंक दें। (कई बुरे विकल्पों में से सर्वश्रेष्ठ विकल्प)
- केवल जब आप इंटरप्ट का स्पष्ट कारण जानते हैं, तो वांछित रूप से संभाल लें। यदि आपकी हैंडलिंग आपकी विधि के लिए स्थानीय है, तो थ्रेड.ट्रैकट्रेड ()। इंटरप्ट () के लिए एक कॉल द्वारा बाधित रीसेट करें।