जम्मू वीएम अंदर एक धागा को मारने के लिए किसी भी तरह से नहीं प्रदान करने के लिए एक परेशान डिजाइन है, लेकिन मेरे सवाल से संबंधित डिजाइन न कर रहा है।
चूंकि आपके वास्तविक प्रश्न का उत्तर दिया गया है, इसलिए मैं उपरोक्त उद्धृत वाक्य को संबोधित करने जा रहा हूं।
इतिहास है कि जावा डिजाइनरों मूल रूप किया मारे गए और धागे निलंबित के मुद्दे का समाधान करने का प्रयास है, लेकिन वे एक मौलिक समस्या का सामना किया है कि वे जावा भाषा के संदर्भ में हल नहीं कर सकता है।
समस्या यह है कि आप सुरक्षित रूप से उन धागे को मार नहीं सकते हैं जो गैर-परमाणु फैशन में साझा डेटा को म्यूट कर सकते हैं या जो प्रतीक्षा/सूचना तंत्र का उपयोग करके दूसरे के साथ सिंक्रनाइज़ कर सकते हैं। यदि आप इस संदर्भ में थ्रेड हत्या को कार्यान्वित करते हैं, तो आप डेटा संरचनाओं के आंशिक अपडेट के साथ समाप्त होते हैं, और अन्य धागे सूचित करने के लिए प्रतीक्षा करते हैं जो कभी नहीं पहुंचेंगे। दूसरे शब्दों में, एक थ्रेड को मारना शेष एप्लिकेशन को एक अनिश्चित और टूटी हुई स्थिति में छोड़ सकता है।
अन्य भाषाओं/पुस्तकालयों (जैसे सी, सी ++, सी #) जो आपको उपरोक्त वर्णित समस्याओं से ग्रस्त थ्रेड को मारने की अनुमति देते हैं, भले ही प्रासंगिक विनिर्देश/पाठ्य पुस्तकें यह स्पष्ट न करें। जबकि धागे को मारना संभव है, आपको इसे सुरक्षित रूप से करने के लिए पूरे एप्लिकेशन के डिजाइन और कार्यान्वयन में वास्तव में सावधान रहना होगा। आम तौर पर बोलना सही होने के लिए बहुत मुश्किल है।
तो (hypothetically) जावा में थ्रेड की हत्या को सुरक्षित करने के लिए क्या होगा? यहां कुछ सुझाव दिए गए हैं:
अपने JVM कार्यान्वित आइसोलेट्स आप गणना है कि आप एक बच्चे को अलग में मारने के लिए चाहते हो सकता है का शुभारंभ सकता है। समस्या यह है कि एक उचित ढंग से लागू अलगाव केवल संदेश पास करके अन्य अलगाव के साथ संवाद कर सकता है, और वे आम तौर पर उपयोग करने के लिए बहुत अधिक महंगा होंगे।
साझा परिवर्तनीय स्थिति की समस्या पूरी तरह से उत्परिवर्तन पर प्रतिबंध लगाकर या जावा निष्पादन मॉडल में लेनदेन जोड़कर संबोधित किया जा सकता है। ये दोनों मौलिक रूप से जावा बदल देंगे।
प्रतीक्षा/अधिसूचना की समस्या को इसे एक मिलनसार या संदेश उत्तीर्ण तंत्र के साथ बदलकर संबोधित किया जा सकता है जिसने "अन्य" धागे को सूचित किया है कि वह जिस थ्रेड के साथ बातचीत कर रहा था, वह दूर हो गया है। "अन्य" थ्रेड को अभी भी इसे पुनर्प्राप्त करने के लिए कोड करने की आवश्यकता होगी।
संपादित - जवाब में commments करने के लिए।
म्यूटेक्स डेडलॉक thread.destroy()
के लिए कोई मुद्दा नहीं था क्योंकि इसे नष्ट किए गए थ्रेड के स्वामित्व वाले सभी म्यूटेक्स को रिलीज़ करने (ब्रेक) करने के लिए डिज़ाइन किया गया था। समस्या यह थी कि इस बात की कोई गारंटी नहीं थी कि लॉक टूटने के बाद म्यूटेक्स द्वारा संरक्षित डेटा संरचना एक गंभीर स्थिति में होगी।
अगर मैं सही ढंग से इस विषय के इतिहास को समझने, Thread.suspend()
, Thread.delete()
और इतने पर वास्तव में असली दुनिया जावा 1.0 अनुप्रयोगों में कारण समस्याओं था। और ये समस्याएं इतनी गंभीर थीं, और आवेदन लेखकों के साथ सौदा करने के लिए इतना कठिन था कि जेवीएम डिजाइनरों ने फैसला किया कि सर्वोत्तम पाठ्यक्रम विधियों को कम करना था। यह बनाने का एक आसान निर्णय नहीं होता।
अब, अगर आप बहादुर हैं आप वास्तव में इन तरीकों का उपयोग कर सकते हैं। और वे वास्तव में कुछ मामलों में सुरक्षित हो सकते हैं। लेकिन बहिष्कृत तरीकों के आसपास एक आवेदन का निर्माण ध्वनि सॉफ्टवेयर इंजीनियरिंग अभ्यास नहीं है।
आवेदन सर्वर क्या कर सकते हैं जब एक सेम अनंत लूप अपने तरीकों में से एक में "लागू किया" है? पूरे एप्लिकेशन सर्वर को ओएस स्तर पर पुनरारंभ करने की आवश्यकता है? – sibidiba
@ सिबिडिबा - हां। यह इसके बारे में। –