2010-02-19 9 views
6

जावा में धागे को नष्ट कर दिया गया है (और जावाडोक के अनुसार लागू नहीं किया गया है), और इसे बाधित करने का सुझाव केवल एक सुझाव है जो थ्रेड पर छोड़ने की उम्मीद है, लेकिन ऐसा नहीं हो सकता है। (जे वीएम अंदर एक धागा एक परेशान डिजाइन, है को मारने के लिए किसी भी तरह से प्रदान नहीं करने के लिए, लेकिन मेरे सवाल से संबंधित डिजाइन न कर रहा है।)क्या जावा ऐप सर्वर धागे को नष्ट करने में सक्षम हैं? यदि हां, तो कैसे?

कैसे जावा अनुप्रयोग सर्वर अनुप्रयोगों उतारना करते हैं? क्या वे किसी भी तरह से अनलोड किए गए एप्लिकेशन के थ्रेड को नष्ट करने में सक्षम हैं? यदि हां, तो कैसे? यदि नहीं, तो एक अनंत-लूप वाले एक तैनात ऐप का एक थ्रेड हस्तक्षेप करने की संभावना के बिना एक संपूर्ण ऐप सर्वर ला सकता है?

क्षमा करें कि मैं इसके लिए टेस्ट केस नहीं लिख रहा हूं, लेकिन मैं जानना चाहता हूं कि वास्तव में क्या चल रहा है।

उत्तर

2

आपको किसी ईजीबी सर्वर के अंदर अपना खुद का धागा बनाने की अनुमति नहीं है। और उन धागों का जीवन चक्र प्रबंधन करने के लिए सुनिश्चित हो -

यह नहीं है कि असामान्य एक वेब कंटेनर में धागे (जैसे जैसे बिल्ला के रूप में) अंडे देने के लिए, हालांकि तुम सच में ध्यान से कर रही के बारे में सोचना चाहिए।

+1

आवेदन सर्वर क्या कर सकते हैं जब एक सेम अनंत लूप अपने तरीकों में से एक में "लागू किया" है? पूरे एप्लिकेशन सर्वर को ओएस स्तर पर पुनरारंभ करने की आवश्यकता है? – sibidiba

+1

@ सिबिडिबा - हां। यह इसके बारे में। –

11

जम्मू वीएम अंदर एक धागा को मारने के लिए किसी भी तरह से नहीं प्रदान करने के लिए एक परेशान डिजाइन है, लेकिन मेरे सवाल से संबंधित डिजाइन न कर रहा है।

चूंकि आपके वास्तविक प्रश्न का उत्तर दिया गया है, इसलिए मैं उपरोक्त उद्धृत वाक्य को संबोधित करने जा रहा हूं।

इतिहास है कि जावा डिजाइनरों मूल रूप किया मारे गए और धागे निलंबित के मुद्दे का समाधान करने का प्रयास है, लेकिन वे एक मौलिक समस्या का सामना किया है कि वे जावा भाषा के संदर्भ में हल नहीं कर सकता है।

समस्या यह है कि आप सुरक्षित रूप से उन धागे को मार नहीं सकते हैं जो गैर-परमाणु फैशन में साझा डेटा को म्यूट कर सकते हैं या जो प्रतीक्षा/सूचना तंत्र का उपयोग करके दूसरे के साथ सिंक्रनाइज़ कर सकते हैं। यदि आप इस संदर्भ में थ्रेड हत्या को कार्यान्वित करते हैं, तो आप डेटा संरचनाओं के आंशिक अपडेट के साथ समाप्त होते हैं, और अन्य धागे सूचित करने के लिए प्रतीक्षा करते हैं जो कभी नहीं पहुंचेंगे। दूसरे शब्दों में, एक थ्रेड को मारना शेष एप्लिकेशन को एक अनिश्चित और टूटी हुई स्थिति में छोड़ सकता है।

अन्य भाषाओं/पुस्तकालयों (जैसे सी, सी ++, सी #) जो आपको उपरोक्त वर्णित समस्याओं से ग्रस्त थ्रेड को मारने की अनुमति देते हैं, भले ही प्रासंगिक विनिर्देश/पाठ्य पुस्तकें यह स्पष्ट न करें। जबकि धागे को मारना संभव है, आपको इसे सुरक्षित रूप से करने के लिए पूरे एप्लिकेशन के डिजाइन और कार्यान्वयन में वास्तव में सावधान रहना होगा। आम तौर पर बोलना सही होने के लिए बहुत मुश्किल है।

तो (hypothetically) जावा में थ्रेड की हत्या को सुरक्षित करने के लिए क्या होगा? यहां कुछ सुझाव दिए गए हैं:

  • अपने JVM कार्यान्वित आइसोलेट्स आप गणना है कि आप एक बच्चे को अलग में मारने के लिए चाहते हो सकता है का शुभारंभ सकता है। समस्या यह है कि एक उचित ढंग से लागू अलगाव केवल संदेश पास करके अन्य अलगाव के साथ संवाद कर सकता है, और वे आम तौर पर उपयोग करने के लिए बहुत अधिक महंगा होंगे।

  • साझा परिवर्तनीय स्थिति की समस्या पूरी तरह से उत्परिवर्तन पर प्रतिबंध लगाकर या जावा निष्पादन मॉडल में लेनदेन जोड़कर संबोधित किया जा सकता है। ये दोनों मौलिक रूप से जावा बदल देंगे।

  • प्रतीक्षा/अधिसूचना की समस्या को इसे एक मिलनसार या संदेश उत्तीर्ण तंत्र के साथ बदलकर संबोधित किया जा सकता है जिसने "अन्य" धागे को सूचित किया है कि वह जिस थ्रेड के साथ बातचीत कर रहा था, वह दूर हो गया है। "अन्य" थ्रेड को अभी भी इसे पुनर्प्राप्त करने के लिए कोड करने की आवश्यकता होगी।

संपादित - जवाब में commments करने के लिए।

म्यूटेक्स डेडलॉक thread.destroy() के लिए कोई मुद्दा नहीं था क्योंकि इसे नष्ट किए गए थ्रेड के स्वामित्व वाले सभी म्यूटेक्स को रिलीज़ करने (ब्रेक) करने के लिए डिज़ाइन किया गया था। समस्या यह थी कि इस बात की कोई गारंटी नहीं थी कि लॉक टूटने के बाद म्यूटेक्स द्वारा संरक्षित डेटा संरचना एक गंभीर स्थिति में होगी।

अगर मैं सही ढंग से इस विषय के इतिहास को समझने, Thread.suspend(), Thread.delete() और इतने पर वास्तव में असली दुनिया जावा 1.0 अनुप्रयोगों में कारण समस्याओं था। और ये समस्याएं इतनी गंभीर थीं, और आवेदन लेखकों के साथ सौदा करने के लिए इतना कठिन था कि जेवीएम डिजाइनरों ने फैसला किया कि सर्वोत्तम पाठ्यक्रम विधियों को कम करना था। यह बनाने का एक आसान निर्णय नहीं होता।

अब, अगर आप बहादुर हैं आप वास्तव में इन तरीकों का उपयोग कर सकते हैं। और वे वास्तव में कुछ मामलों में सुरक्षित हो सकते हैं। लेकिन बहिष्कृत तरीकों के आसपास एक आवेदन का निर्माण ध्वनि सॉफ्टवेयर इंजीनियरिंग अभ्यास नहीं है।

+1

यह, एक बार –

+0

मैं कट्टर जेवीएम डिजाइनर नहीं हूं, लेकिन डीलक्स के बारे में सभी तर्क इतने बड़े हैं। इस सुविधा को अक्षम करने से जावा डेडलॉक प्रवण नहीं हुआ। मैं बस एक ताला करता हूं, और इसे अनलॉक नहीं करता हूं। की अनुमति दे thread.destroy() वास्तव में गतिरोध की एक नई संभावना को पेश होगा, लेकिन क्यों इस दुनिया पर मैं (प्रोग्रामर या JVM के अनुसार) एक धागा है कि _any_ संसाधन नहीं रखता है को मारने के लिए अनुमति नहीं कर रहा हूँ? – sibidiba

+1

@ सिबिडा: पिछले कुछ दिनों में, मैंने धागे को नष्ट करने के लिए बहिष्कृत विधियों का उपयोग करना जारी रखा था, मुझे पता था कि यह नष्ट करने के लिए 'सुरक्षित' था और मुझे कभी भी कोई समस्या नहीं थी ... * लेकिन * मैंने ऐसी चीज करने में काफी समय लगाया है : कुछ 'कन्टेक्सिट' बूलियन को सच्चाई, आदि को सेट करके, एक ब्लॉकिंग कतार पर एक जहर गोली डालकर, कुछ सॉकेट बंद करके, या तो उस धागे को 'रद्द' करने का हमेशा एक तरीका होता है, जिसे मैं सोचता था एक 'नष्ट' वास्तव में जरूरी था और इसे कर रहा था, लेकिन अब मैं और नहीं कर रहा हूं। हमेशा एक और तरीका सही है? एक ऐसा मामला क्या होगा जहां धागे को 'साफ-सफाई' करने का कोई तरीका नहीं होगा? – SyntaxT3rr0r