2011-08-15 22 views
36

मुझे पता है कि डेमॉन धागे पृष्ठभूमि धागे। हम setDaemon(true) पर कॉल करके अपना खुद का डिमन थ्रेड बना सकते हैं।डेमॉन धागे कब उपयोगी होते हैं?

मेरा प्रश्न है: हमें क्यों और कब हमारे धागे को डिमन थ्रेड के रूप में बनाने की आवश्यकता है?

उत्तर

43

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

+0

आपके उदाहरण में, जब उपयोगकर्ता गेम को समाप्त करने का निर्णय लेता है, तो क्या उपयोगकर्ता थ्रेड (और डेमॉन थ्रेड नहीं) होने पर JVM ब्लॉक होगा? – Kal

+0

@ काल: हाँ, यह वही तरीका है जो काम करता है। उपयोगकर्ता थ्रेड JVM को बंद करने से रोकेंगे। –

+1

हां: यदि मुख्य विधि बस लौटती है, तो JVM चल रहा रहेगा। बेशक, अगर आप System.exit को कॉल करते हैं, तो यह चलना बंद कर देगा। –

10

एक डीमॉन थ्रेड स्वचालित रूप से JVM द्वारा समाप्त हो जाता है जब सभी "सामान्य" धागे समाप्त हो जाते हैं। सामान्य धागे कभी स्वचालित रूप से समाप्त नहीं होते हैं।

4

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

परिणामस्वरूप, उपयोगकर्ता-थ्रेड मौजूद होने तक JVM gurantees मौजूद है कि डेमॉन थ्रेड लगातार चलते हैं। आप जीसी, यूआई थ्रेड इत्यादि जैसे उदाहरण पा सकते हैं .. वे डेमन्स हैं।

उम्मीद है कि यह मदद करता है।

1

आम तौर पर कार्यक्रम समाप्त हो जाता है जब उसके सभी धागे run() विधि से बाहर निकलते हैं। डेमॉन थ्रेड प्रोग्राम को तब भी समाप्त नहीं करते हैं, भले ही वे अभी भी चल रहे हों, यानी run() निष्पादित कर रहे हैं।

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

2

जैसा कि अन्य ने इंगित किया है, एक डिमन थ्रेड JVM को बाहर निकलने से नहीं रोकता है जब यह थ्रेड अभी भी चल रहा है जब प्रोग्राम समाप्त होता है।

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

0

मैंने उन फ़ाइलों को हटाने के लिए टाइमर के साथ उपयोग किया जो तत्काल हटाया नहीं जा सकता है। यही है, मैं .exe फ़ाइलों को उत्पन्न करता हूं, चलाता हूं और फिर उन्हें हटा देता हूं। लेकिन 50% मौका है कि executable.delete विफल रहता है, प्रतीत होता है क्योंकि छवि अभी भी समाप्त होने की प्रक्रिया से अवरुद्ध है। पूरी तरह से प्रक्रिया पूरी होने के बाद ही आप विश्वसनीय रूप से निष्पादन योग्य छवि को हटा सकते हैं। लेकिन, आप कभी नहीं जानते कि यह कितना समय लगता है। इसलिए आप .delete के बजाय .deleteOnExit सेट करें। लेकिन, जब तक जावा मशीन समाप्त नहीं हो जाती तब तक आप इंतजार नहीं करना चाहते हैं। इसमें बहुत समय लग सकता है और आप लाखों बेकार बेवकूफ .exe फ़ाइलों को नहीं चाहते हैं, जिन्हें आपको अब सिस्टम सिस्टम में लटकने की आवश्यकता नहीं है। इसलिए आप एक-दो सेकंड बाद टाइमर में निष्पादन योग्य .delete शेड्यूल करते हैं। टाइमर हालांकि सामान्य धागा नहीं हो सकता है। यदि ऐसा है, तो यह आपके प्रोग्राम को समाप्त करने से रोक देगा, भले ही हटाए जाने के लिए कोई फ़ाइल न हो। मैं आसानी से इसे डिमन बना सकता हूं, हालांकि टाइमर द्वारा मेरी फाइलें हटा दी गई हैं या नहीं, यह असीमित है - फ़ाइलों को किसी भी तरह से हटा दिया जाएगा: या तो डेमन या जावा निकास से। मुझे लगता है कि यह डेमन का सही उपयोग है।

0

जावा में डेमॉन थ्रेड अन्य थ्रेड या ऑब्जेक्ट्स के लिए एक सेवा प्रदाता की तरह हैं जो डेमॉन थ्रेड के समान प्रक्रिया में चल रहे हैं। डेमॉन थ्रेड का उपयोग पृष्ठभूमि सहायक कार्यों के लिए किया जाता है और केवल सामान्य थ्रेड निष्पादित होने पर ही आवश्यक होते हैं।यदि सामान्य धागे नहीं चल रहे हैं और शेष धागे डिमन थ्रेड हैं तो दुभाषिया निकलता है।

जब कोई नया धागा बनाया जाता है तो यह अपने माता-पिता की डिमन स्थिति प्राप्त करता है। सामान्य थ्रेड और डिमन थ्रेड अलग-अलग होते हैं जब वे बाहर निकलते हैं। जब JVM किसी भी शेष डिमन थ्रेड को रोकता है तो छोड़ दिया जाता है: अंततः ब्लॉक निष्पादित नहीं होते हैं, ढेर अवांछित नहीं होते हैं - JVM बस बाहर निकलता है। इस कारण से डिमन थ्रेड का उपयोग कम से कम किया जाना चाहिए और उन कार्यों के लिए उनका उपयोग करना खतरनाक है जो किसी भी प्रकार का I/O कर सकते हैं।

+0

डेमॉन थ्रेड में आईओ ऑपरेशंस का उपयोग करने से बचने का प्रयास करें क्योंकि यह भ्रष्ट हो सकता है डेटा। –

संबंधित मुद्दे