2015-07-06 9 views
7

मैं जावा की setDaemon() विधि के बारे में दस्तावेज़ पढ़ रहा हूं, और जब मैं पढ़ता हूं कि जेएमएम डिमन थ्रेड समाप्त होने के इंतजार किए बिना बाहर निकलता है तो उलझन में आता है।JVM बाहर निकलने के बाद डेमॉन थ्रेड कैसे जीवित रहता है?

हालांकि, चूंकि अनिवार्य रूप से डेमॉन थ्रेड जावा Thread है, जो संभावित रूप से अपनी कार्यक्षमताओं को प्राप्त करने के लिए जेवीएम पर चलने पर भरोसा करते हैं, तो डेमॉन थ्रेड समाप्त होने से पहले जेवीएम बाहर निकलने पर डेमॉन थ्रेड कैसे बचते हैं?

+0

आप केवल गलतफहमी कर रहे हैं कि डेमॉन थ्रेड को समाप्त करने के लिए क्या मतलब है _ साधन। समाप्त का अर्थ है 'रननेबल' की 'रन' विधि का पूर्ण निष्पादन। –

+0

कहां कहता है कि वे जीवित रहते हैं? आपका प्रश्न समझ में नहीं आता है, – EJP

उत्तर

15

वे जीवित नहीं रहते हैं। जेवीएम बाहर निकल जाएगा जब सभी धागे, डेमॉन को छोड़कर, मर गए हैं।

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

एक बार मुख्य विधि निकल जाने के बाद, यह मुख्य धागा मर जाएगा, और यदि आपने कोई अन्य गैर-डिमन थ्रेड नहीं बनाया है, तो JVM बाहर निकल जाएगा।

यदि आपने एक और धागा शुरू किया है, तो JVM बाहर नहीं निकलेगा, यह बाहर निकलने से पहले सभी गैर-डिमन धागे मरने की प्रतीक्षा करेगा।

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

तो, सिद्धांत रूप में, आपको जेवीएम से बाहर निकलने के लिए अनुमति देने वाले सभी थ्रेड को रोकने के लिए कहीं भी कुछ कोड रखना चाहिए।

चूंकि यह त्रुटि प्रवण है, इसलिए इस तरह के गैर-महत्वपूर्ण धागे को डेमॉन के रूप में चिह्नित करना आसान तरीका है। यदि उन्हें इस तरह चिह्नित किया गया है, तो JVM बाहर निकलने से पहले मरने की प्रतीक्षा नहीं करेगा, जेवीएम बाहर निकल जाएगा और उन धागे को मार देगा जब "मुख्य धागे" (जिन्हें डिमन के रूप में चिह्नित नहीं किया गया) की मृत्यु हो गई है।

public class Spawner { 
    public static void main(String[] args) { 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
     while (true) { 
      System.out.println("I'm still alive"); 
     } 
     } 
    }); 
    t.start(); 
    // Try uncommenting/commenting this line 
    // t.setDaemon(true); 
    System.out.println("Main thread has finished"); 
    } 
} 

(मैं इस कोड का परीक्षण नहीं किया,, सीधे यहां यह लिखा था तो यह बेवकूफ गलतियों को रख सकती):

कोड में कहें

, यह कुछ इस तरह है।

लाइन के साथ इस कोड को चलाने पर टिप्पणी करते समय, धागा deamon नहीं है, इसलिए यदि आपकी मुख्य विधि समाप्त हो गई है, तो आप कंसोल बाढ़ को तब तक जारी रखेंगे जब तक आप इसे CTRL + C से रोक नहीं देते। यही है, जेवीएम बाहर नहीं निकलेगा।

यदि आप लाइन को असम्बद्ध करते हैं, तो थ्रेड एक डिमन है, और मुख्य विधि समाप्त होने के तुरंत बाद, थ्रेड मारा जाएगा और JVM CTRL + C की आवश्यकता के बिना बाहर निकल जाएगा।

+0

क्या होगा अगर मैं कुछ बंदरगाहों पर कुछ घटनाओं को पकड़ने के लिए श्रोता चाहता हूं? ऐसा लगता है जैसे JVM बाहर निकलने के बाद श्रोता की हत्या होगी, तो क्या मैं बस अपना श्रोता खो देता हूं? – OneZero

+0

हां, यदि JVM मौजूद है, तो आपका प्रोग्राम समाप्त हो गया है, सभी संसाधन मुक्त हैं, इसलिए आप अब किसी भी पोर्ट पर नहीं सुन रहे हैं। –

+0

हालांकि सिस्टम प्रोग्रामिंग प्रश्न के अधिक है। मूल रूप से, ओएस प्रक्रिया से बाहर निकलने पर क्या करता है। यह जावा के लिए विशिष्ट नहीं है। – the8472

2

जेएमएम बाहर निकलने पर डेमॉन जीवित नहीं रहेगा।

चाहे यह एक डिमन है या नहीं, जावा थ्रेड जावा वर्चुअल मशीन पर चलता है। यदि वर्चुअल मशीन मर जाती है, तो उस पर चलने वाले प्रत्येक जावा थ्रेड के साथ मर जाता है, जिसमें डेमन थ्रेड भी शामिल हैं।

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

जैसे ही सभी उपयोगकर्ता थ्रेड निष्पादन जावा प्रोग्राम या जेवीएम समाप्त हो जाता है, JVM डेमॉन थ्रेड के निष्पादन को समाप्त करने की प्रतीक्षा नहीं करता है। जैसे ही अंतिम गैर डिमन थ्रेड समाप्त होता है, JVM समाप्त हो जाता है इससे कोई फर्क नहीं पड़ता कि कितने डेमॉन थ्रेड मौजूद हैं या JVM के अंदर चल रहे हैं।

नोट: डेमॉन थ्रेड बंद होने पर बाधित नहीं होते हैं और न ही उनके अंतिम() विधियों को जरूरी रूप से बुलाया जाता है।

तुम हमेशा JVM रनटाइम करने के लिए एक बंद हुक जोड़ सकते हैं:

Thread shutdownHook = ... // construct a thread that performs graceful 
          // shutdown of JVM 
Runtime.getRuntime().addShutdownHook(shutdownHook); 

बंद हुक अपनी जरूरत के अनुसार एक डेमॉन धागे की सुंदर बंद कर सकते हैं।

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