जावा में डेमन थ्रेड क्या है?


809

क्या कोई बता सकता है कि जावा में डेमन धागे क्या हैं ?


20
Thread: जावाडोक का वर्णन करता है कि वे क्या हैं java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
डेमन थ्रेड्स के लिए, जब जेवीएम बंद हो जाता है सभी डेमन थ्रेड्स बाहर निकल जाते हैं इस कारण से डेमन थ्रेड्स का अक्सर उपयोग नहीं किया जाना चाहिए क्योंकि सफाई उन पर निष्पादित नहीं हो सकती है। उदाहरण के लिए कोई भी I / O सुंदर तरीके से बाहर नहीं निकलेगा और अंत तक सभी तरह से लिख / पढ़ सकता है।
msj121

जवाबों:


631

डेमन थ्रेड एक ऐसा थ्रेड है, जो प्रोग्राम खत्म होने पर जेवीएम को बाहर निकलने से नहीं रोकता है, लेकिन थ्रेड अभी भी चल रहा है। डेमन थ्रेड के लिए एक उदाहरण कचरा संग्रह है।

थ्रेड शुरू होने से पहले डेमन गुणों setDaemon(boolean)को बदलने के लिए आप विधि का उपयोग कर सकते हैं Thread


210
पोस्टीरिटी के लिए, setDamon(boolean)केवल थ्रेड शुरू होने से पहले बुलाया जा सकता है। डिफ़ॉल्ट रूप से धागा अपने मूल धागे की डेमॉन स्थिति को विरासत में लेता है।
ग्रे

1
"कार्यक्रम समाप्त होने पर जेवीएम को बाहर निकलने से नहीं रोकता है, लेकिन धागा अभी भी चल रहा है", जबकि @ सतेश कहते हैं कि "जेवीएम किसी भी शेष डेमन थ्रेड को छोड़ दिया जाता है"। जब जेवीएम बाहर निकलता है तो डेमन थ्रेड्स खत्म हो जाते हैं?
गेराल्ड

23
JVM के बाहर निकलने पर @ गेराल्ड, सभी धागे मारे गए। B_erb ने कहा, "... जब कार्यक्रम समाप्त हो गया।" इसका क्या मतलब है, अगर कार्यक्रम स्पष्ट रूप से जेवीएम को नहीं मारता है, तो जेवीएम स्वचालित रूप से खुद को मार देगा जब अंतिम गैर- डेडेमोन धागा समाप्त हो जाएगा। सामान्य धागे परिभाषित करते हैं "जब कार्यक्रम बाहर निकलता है।" डेमन धागे नहीं हैं।
सोलोमन स्लो

2
तो इस लाइन का thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningमूल रूप से मतलब है कि जेवीएम प्रक्रिया जिसने धागा शुरू किया था उसे इस बात से कोई फर्क नहीं पड़ता है कि डेमन थ्रेड निष्पादन को समाप्त कर रहा है या नहीं, यह केवल तभी समाप्त होगा जब सभी सामान्य थ्रेड्स का निष्पादन समाप्त हो गया हो।
भार्गव

1
@ सोलोमनस्लो एक डेमन थ्रेड को मारने के परिणाम क्या हैं (उदाहरण के लिए, एक कचरा कलेक्टर) जबकि यह अभी भी अपना काम कर रहा है, जब जेवीएम समाप्त होता है? धन्यवाद।
वेंकट रामकृष्णन

340

कुछ और बिंदु (संदर्भ: व्यवहार में जावा कंजेरिबिलिटी )

  • जब एक नया धागा बनाया जाता है, तो यह अपने माता-पिता के डेमन स्टेटस को विरासत में मिलता है।
  • जब सभी गैर-डेमन धागे समाप्त हो जाते हैं, तो JVM रुक जाता है, और किसी भी शेष डेमन धागे को छोड़ दिया जाता है :

    • अंत में ब्लॉक निष्पादित नहीं किए जाते हैं ,
    • ढेर अनजाने नहीं हैं - जेवीएम सिर्फ बाहर निकलता है।

    इस कारण से डेमन थ्रेड्स का उपयोग संयम से किया जाना चाहिए, और उन कार्यों के लिए उनका उपयोग करना खतरनाक है जो किसी भी प्रकार का I / O प्रदर्शन कर सकते हैं।


3
डेमन थ्रेड्स का उपयोग I / O के लिए क्यों नहीं किया जाना चाहिए? क्या यह बफ़र्डविटर आदि के बारे में एक चिंता का विषय है?
पॉल कैगर

4
@PaCCager हाँ, वे केवल लिखने / पढ़ने के बीच में घुटनों के बल कट सकते हैं।
क्रंचर

52
दूसरा बिंदु बकवास है। जब JVM रुकता है, तो सभी थ्रेड्स मर जाते हैं और कोई भी finallyब्लॉक निष्पादित नहीं होता है, भले ही थ्रेड डेमॉन हो या नहीं। इसलिए System.exit(…)अगर आपको लगता है कि I / O करने वाले थ्रेड चल रहे हैं तो कॉल न करें । अंतर केवल इतना है कि जेवीएम अपनी समाप्ति को ट्रिगर करेगा जब केवल डेमन थ्रेड्स बचे रहेंगे।
होल्गर

11
"ढेर नहीं हैं" से क्या अभिप्राय है?
ɢʜʘʂʈ

2
@ @ "अनडिंडिंग स्टैक्स" पर कुछ स्पष्टीकरण हैं, इसमें यह भी शामिल है: flylib.com/books/en/2.254.1.277/1
user766353

175

उपरोक्त सभी उत्तर अच्छे हैं। अंतर बताने के लिए यहां एक साधारण सा कोड स्निपेट दिया गया है। सच्चे और झूठे मूल्यों में से प्रत्येक के साथ इसे आज़माएं setDaemon

public class DaemonTest {

    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // handle here exception
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {

    public WorkerThread() {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread terminates.
        setDaemon(true); 
    }

    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}

2
@rr अच्छा कोड स्निपेट! मुझे WorkerThread क्लास को स्टैटिक के रूप में परिभाषित करना था।
xli

@xli आप कर सकते थे नई DaemonTest () नई WorkerThread () शुरू () भी
abhy

@ अच्छा उदाहरण। मैं अगर आप स्पष्ट रूप से परिभाषित नहीं करते कि डिफ़ॉल्ट एक "setDeamon (गलत)" है के बारे में पता था, "setDaemon (सही)"
huseyin

96

UNIX में पारंपरिक रूप से डेमॉन प्रक्रियाएं वे थीं जो लगातार पृष्ठभूमि में चल रही थीं, विंडोज में सेवाओं की तरह।

जावा में एक डीमन धागा वह है जो JVM को बाहर निकलने से नहीं रोकता है। विशेष रूप से JVM तभी बाहर निकलेगा जब केवल डेमन थ्रेड रहेंगे। आप setDaemon()विधि को कॉल करके एक बनाते हैं Thread

डेमॉन थ्रेड्स को पढ़ें ।


3
आपका लिंक इस समय मर चुका है, शायद आप अपडेट करना चाहते हैं? वैसे भी, आप के लिए +1।
जेसन जुएल

2
मुझे यूनिक्स और विंडोज के बीच तुलना पसंद है।
प्रेमराज

सबसे अच्छा स्पष्टीकरण यहाँ!
लवमेव

57

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

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

डेमन थ्रेड्स का उपयोग आमतौर पर आपके एप्लिकेशन / एप्लेट (जैसे "फ़िडली बिट्स" को लोड करने के लिए) करने के लिए किया जाता है। उपयोगकर्ता थ्रेड्स और डेमन थ्रेड्स के बीच मुख्य अंतर यह है कि जेवीएम केवल एक प्रोग्राम को बंद कर देगा जब सभी उपयोगकर्ता थ्रेड्स समाप्त हो जाएंगे। डेमन थ्रेड्स को JVM द्वारा समाप्त किया जाता है जब निष्पादन के मुख्य धागे सहित कोई भी उपयोगकर्ता थ्रेड चल नहीं रहे हैं।

सेटडोमन (सच्चा / झूठा)? इस विधि का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि एक धागा डेमॉन थ्रेड है।

सार्वजनिक बूलियन है डेमॉन ()? इस विधि का उपयोग यह निर्धारित करने के लिए किया जाता है कि धागा डेमॉन थ्रेड है या नहीं।

उदाहरण के लिए:

public class DaemonThread extends Thread {
    public void run() {
        System.out.println("Entering run method");

        try {
            System.out.println("In run Method: currentThread() is" + Thread.currentThread());

            while (true) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException x) {}

                System.out.println("In run method: woke up again");
            }
        } finally {
            System.out.println("Leaving run Method");
        }
    }
    public static void main(String[] args) {
        System.out.println("Entering main Method");

        DaemonThread t = new DaemonThread();
        t.setDaemon(true);
        t.start();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException x) {}

        System.out.println("Leaving main method");
    }

}

आउटपुट:

C:\java\thread>javac DaemonThread.java

C:\java\thread>java DaemonThread
Entering main Method
Entering run method
In run Method: currentThread() isThread[Thread-0,5,main]
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
In run method: woke up again
Leaving main method

C:\j2se6\thread>

37

डेमॉन की परिभाषा (कम्प्यूटिंग):

एक पृष्ठभूमि प्रक्रिया जो प्रिंट स्पूलिंग और फ़ाइल स्थानांतरण जैसी सेवाओं के लिए अनुरोधों को संभालती है, और जब आवश्यक नहीं होती है तो निष्क्रिय होती है।

—— स्रोत: अंग्रेजी ऑक्सफोर्ड डिक्सर्स द्वारा

जावा में डेमॉन धागा क्या है?

  • डेमन थ्रेड्स अपने प्रवाह के बीच किसी भी समय बंद हो सकते हैं, नॉन-डेमन यानी उपयोगकर्ता थ्रेड पूरी तरह से निष्पादित होता है।
  • डेमन थ्रेड्स थ्रेड होते हैं जो पृष्ठभूमि में रुक-रुक कर चलते हैं जब तक कि अन्य गैर-डेमन थ्रेड चल रहे होते हैं।
  • जब सभी गैर-डीमन धागे पूरे हो जाते हैं, तो डेमन थ्रेड्स स्वचालित रूप से समाप्त हो जाते हैं।
  • डेमन थ्रेड्स उसी प्रक्रिया में चलने वाले उपयोगकर्ता थ्रेड्स के लिए सेवा प्रदाता हैं।
  • जेवीएम रनिंग राज्य में पूरा करने के लिए डेमन थ्रेड्स की परवाह नहीं करता है, अंत में ब्लॉक को भी निष्पादित नहीं करता है। जेवीएम हमारे द्वारा बनाई गई गैर-डेमॉन थ्रेड्स को वरीयता देते हैं।
  • डेमन थ्रेड विंडोज में सेवाओं के रूप में कार्य करता है।
  • JVM सभी उपयोगकर्ता थ्रेड्स (डेमन थ्रेड्स के विपरीत) समाप्त होने पर डेमन थ्रेड्स को रोकता है। इसलिए डेमन थ्रेड्स को लागू करने के लिए उपयोग किया जा सकता है, उदाहरण के लिए, जेवीएम द्वारा थ्रेड को रोक दिया जाता है जैसे ही सभी उपयोगकर्ता थ्रेड्स बंद हो जाते हैं, एक निगरानी कार्यक्षमता।

यदि आप System.exit () को कॉल करते हैं, तो कोई भी अंत में ब्लॉक निष्पादित नहीं होते हैं, भले ही धागा एक डेमन थ्रेड हो। वास्तव में अंत में ब्लॉक भी डेमॉन धागे में क्रियान्वित कर रहे हैं के बाद पिछले उपयोगकर्ता धागा समाप्त हो जाता है JVM अभी तक धागे को मारने नहीं था
benez

5
एक डेमॉन थ्रेड उसी प्राथमिकता पर निष्पादित होता है जब तक कि इसे बनाना थ्रेड नहीं होता है, जब तक कि इसे शुरू करने से पहले नहीं बदला गया हो। डेमन थ्रेड्स आवश्यक रूप से 'सर्विस प्रोवाइडर' या विंडोज सर्विसेज या यहां बताई गई कोई चीज नहीं हैं: वे सिर्फ ऐसे थ्रेड हैं जो जेवीएम को बाहर निकलने से नहीं रोकते हैं। अवधि।
user207421

35

एक डेमॉन धागा एक धागा है कि माना जाता निपटने अनुरोधों या विभिन्न chronjobs कि एक आवेदन में मौजूद कर सकते हैं की तरह पृष्ठभूमि में कुछ कार्य कर रही है।

जब आपके प्रोग्राम में केवल डेमन थ्रेड शेष है तो यह बाहर निकल जाएगा। ऐसा इसलिए क्योंकि आमतौर पर ये धागे सामान्य धागों के साथ मिलकर काम करते हैं और घटनाओं की पृष्ठभूमि से निपटने का काम करते हैं।

आप यह निर्दिष्ट कर सकते हैं कि विधि का उपयोग करके Threadएक डेमॉन हैsetDaemon , वे आमतौर पर बाहर नहीं निकलते हैं, न ही वे बाधित होते हैं .. वे बस रुकते हैं जब आवेदन बंद हो जाता है।


1
ऐसा इसलिए है क्योंकि यह एक डेमॉन थ्रेड है, और यही 'डेमॉन' का अर्थ है। आपका तर्क सामने है।
user207421

15

एक गलत धारणा जो मैं स्पष्ट करना चाहूंगा:

  • मान लें कि यदि डेमन थ्रेड (बी कहते हैं) उपयोगकर्ता थ्रेड (ए) के भीतर बनाया गया है; तब इस उपयोगकर्ता थ्रेड / पैरेंट थ्रेड (ए) के समाप्त होने से डेमॉन थ्रेड / चाइल्ड थ्रेड (बी) का निर्माण नहीं होगा; बशर्ते उपयोगकर्ता धागा केवल वर्तमान में चल रहा है।
  • इसलिए धागा समाप्त होने पर माता-पिता का कोई रिश्ता नहीं है। सभी डेमन थ्रेड्स (चाहे वह जहां भी बनाया गया हो) एक बार खत्म हो जाने के बाद एक भी जीवित उपयोगकर्ता थ्रेड नहीं है और इसके कारण जेवीएम समाप्त हो जाता है।
  • यहां तक ​​कि यह दोनों के लिए सच है (माता-पिता / बच्चे) डेमन थ्रेड हैं।
  • यदि एक बाल धागा एक डेमॉन धागे से बनाया गया है, तो वह भी एक डेमन धागा है। यह किसी भी स्पष्ट डेमन थ्रेड ध्वज सेटिंग की आवश्यकता नहीं होगी। इसी तरह यदि कोई बच्चा थ्रेड उपयोगकर्ता थ्रेड से बनाता है, तो वह भी एक उपयोगकर्ता थ्रेड है, यदि आप इसे बदलना चाहते हैं, तो उस बच्चे के थ्रेड की शुरुआत से पहले स्पष्ट डेमन फ्लैग सेटिंग की आवश्यकता होती है।

यह कुछ भी उद्धृत नहीं है। जो पाठ उद्धृत नहीं है, उसके लिए उद्धरण स्वरूपण का उपयोग न करें। 'उद्धरण' का पहला पैराग्राफ गलत है, और दूसरा विरोधाभासी है।
user207421

@ EJP GOT IT है, इसलिए हर एक को दूसरे लोगों को यहाँ उद्धरण देना होगा, न कि उनका अपना। या खुद कहीं बोली है तो यहाँ इंगित करें?
कानागावेलु सुगुमार

हां, यदि आप किसी को उद्धृत करते हैं तो आपको उन्हें कहीं भी उद्धृत करना होगा, जैसे कि यदि आपने किसी को उद्धृत नहीं किया है, तो इसे प्रारूपित न करें जैसे कि आपके पास है। मैं आपके दूसरे वाक्य का सिर या पूंछ नहीं बना सकता।
user207421

12

डेमन थ्रेड और यूजर थ्रेड्स। आम तौर पर प्रोग्रामर द्वारा बनाए गए सभी थ्रेड्स उपयोगकर्ता थ्रेड होते हैं (जब तक कि आप इसे डेमन होने के लिए निर्दिष्ट नहीं करते हैं या आपके पैरेंट थ्रेड एक डेमन थ्रेड हैं)। उपयोगकर्ता थ्रेड आमतौर पर हमारे प्रोग्राम कोड को चलाने के लिए होते हैं। JVM तब तक समाप्त नहीं होता जब तक कि सभी उपयोगकर्ता थ्रेड समाप्त नहीं हो जाते।


10

जावा में एक विशेष प्रकार का धागा होता है जिसे डेमन थ्रेड कहा जाता है।

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

डेमन थ्रेड्स किसके लिए उपयोग किए जाते हैं?

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

इस तरह के धागे का एक विशिष्ट उदाहरण जावा कचरा कलेक्टर है

अभी और है...

  • आप setDaemon()विधि को कॉल करने से पहले केवल विधि कहते हैं start()। एक बार धागा चल रहा है, आप इसकी डेमॉन स्थिति को संशोधित नहीं कर सकते।
  • isDaemon()यह जांचने के लिए विधि का उपयोग करें कि क्या एक धागा एक डेमॉन थ्रेड या एक उपयोगकर्ता थ्रेड है।

8
-1, मुझे विश्वास नहीं है कि डेमन थ्रेड स्वाभाविक रूप से कम प्राथमिकता वाला है। निश्चित रूप से कोई दस्तावेज मैंने ऐसे राज्यों को नहीं देखा है। साथ ही इस एसओ उत्तर का दावा है कि प्राथमिकता और डेमन-नेस ऑर्थोगोनल हैं: stackoverflow.com/a/10298353/839128
माइकफा

5
डेमन थ्रेड्स का प्राथमिकता से कोई लेना-देना नहीं है। आपके पास उच्च प्राथमिकता वाले डेमन थ्रेड या कम प्राथमिकता वाले गैर-डेमन थ्रेड हो सकते हैं।
ग्रे

एक डेमन थ्रेड की शुरुआत में इसके थ्रेड बनाने के समान प्राथमिकता होती है।
user207421

बयान "'केवल तब निष्पादित होता है जब उसी कार्यक्रम का कोई अन्य धागा चल रहा हो" भ्रामक है।
फ्रेड्रिक गॉस ने

9

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


5

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


5

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

नोट करने के लिए अंक:

  1. मुख्य धागा द्वारा बनाया गया कोई भी धागा, जो जावा में मुख्य विधि से चलता है, डिफ़ॉल्ट रूप से गैर-डेमॉन है, क्योंकि थ्रेड से अपने डेमन प्रकृति को विरासत में मिला है, जो इसे बनाता है अर्थात माता-पिता का धागा और चूंकि मुख्य धागा एक गैर डेमन थ्रेड है, इसलिए इसे बनाया गया कोई अन्य धागा जब तक सेटडोमन (सच) कहकर स्पष्ट रूप से डेमॉन न हो जाए, तब तक गैर-डेमन रहें।

  2. Thread.setDaemon (सच) एक थ्रेड डेमॉन बनाता है, लेकिन इसे केवल Java में थ्रेड शुरू करने से पहले कहा जा सकता है। यदि यह थ्रेड पहले से ही चालू है और चल रहा है तो यह IllegalThreadStateException को फेंक देगा।

जावा में डेमन और नॉन डेमन थ्रेड के बीच अंतर:

1) जेवीएम मौजूदा से पहले किसी भी डेमॉन थ्रेड के खत्म होने का इंतजार नहीं करता है।

2) जेवीएम समाप्त होने पर डेमॉन थ्रेड को उपयोगकर्ता थ्रेड से अलग तरीके से व्यवहार किया जाता है, अंत में ब्लॉक नहीं कहा जाता है, स्टैक्स निराधार नहीं हैं और जेवीएम सिर्फ बाहर निकलता है।


5

जावा में, डेमन थ्रेड्स थ्रेड के प्रकारों में से एक है जो जावा वर्चुअल मशीन (जेवीएम) को बाहर निकलने से नहीं रोकता है। डेमन थ्रेड का मुख्य उद्देश्य पृष्ठभूमि कार्य को विशेष रूप से कुछ नियमित आवधिक कार्य या कार्य के मामले में निष्पादित करना है। जेवीएम बाहर निकलने के साथ, डेमन थ्रेड भी मर जाता है।

एक सेट करके thread.setDaemon(true), एक धागा एक डेमॉन धागा बन जाता है। हालाँकि, आप केवल थ्रेड प्रारंभ करने से पहले इस मान को सेट कर सकते हैं।


धागे के अन्य प्रकार क्या हैं जो ऐसा करते हैं? A: कोई नहीं। डेमॉन थ्रेड्स और नॉन-डेमन थ्रेड्स, पीरियड हैं। यह एक द्विआधारी, दो राज्य है।
user207421

5

उपयोगकर्ता थ्रेड्स के गैर-अस्तित्व के कारण jvm निकास के मामले में डेमन थ्रेड्स के व्यवहार का परीक्षण करने के लिए एक उदाहरण है।

कृपया नीचे दिए गए आउटपुट में दूसरी अंतिम पंक्ति पर ध्यान दें, जब मुख्य धागा बाहर निकलता है, डेमन थ्रेड भी मर गया और अंत में ब्लॉक किए गए 9 स्टेटमेंट को प्रिंट नहीं किया । इसका अर्थ यह है कि डेमॉन थ्रेड के अंत में बंद किए गए किसी भी i / o संसाधन को बंद नहीं किया जाएगा यदि जेवीएम उपयोगकर्ता थ्रेड्स के अस्तित्व में नहीं होने के कारण बाहर निकलता है।

public class DeamonTreadExample {

public static void main(String[] args) throws InterruptedException {

    Thread t = new Thread(() -> {
        int count = 0;
        while (true) {
            count++;
            try {
                System.out.println("inside try"+ count);
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.out.println("finally executed"+ count);
            }
        }
    });
    t.setDaemon(true);
    t.start();

    Thread.currentThread().sleep(10000);
    System.out.println("main thread exited");
  }
}

उत्पादन

inside try1
finally executed1
inside try2
finally executed2
inside try3
finally executed3
inside try4
finally executed4
inside try5
finally executed5
inside try6
finally executed6
inside try7
finally executed7
inside try8
finally executed8
inside try9
finally executed9
inside try10
main thread exited

4

डेमन थ्रेड्स जैसा कि सभी ने समझाया है, जेवीएम को बाहर निकलने के लिए विवश नहीं करेगा, इसलिए मूल रूप से एग्जिट पॉइंट ऑफ व्यू से एप्लीकेशन के लिए एक खुश धागा है।

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

सादर, मनीष


यहाँ जावा में डेमॉन थ्रेड दिखाते हुए एक सरल कार्यक्रम है। journaldev.com/1072/java-daemon-thread-example
पंकज

4

डेमन थ्रेड डेमन प्रक्रिया की तरह है जो संसाधनों के प्रबंधन के लिए जिम्मेदार है, उपयोगकर्ता धागे की सेवा करने के लिए जावा वीएम द्वारा एक डेमन थ्रेड बनाया जाता है। यूनिक्स के लिए उदाहरण अद्यतन प्रणाली, यूनिक्स डेमॉन प्रक्रिया है। डेमन थ्रेड का बच्चा हमेशा डेमॉन थ्रेड होता है, इसलिए डिफॉल्ट डेमॉन झूठा होता है। आप "डेडमन ()" विधि का उपयोग करके थ्रेड को डेमन या उपयोगकर्ता के रूप में देख सकते हैं। इसलिए डेमन थ्रेड या डेमन प्रक्रिया मूल रूप से संसाधनों के प्रबंधन के लिए जिम्मेदार होती है। उदाहरण के लिए जब आप jvm शुरू करते हैं तो कचरा संग्रहकर्ता होता है जो डेमन थ्रेड चल रहा है जिसकी प्राथमिकता 1 है जो सबसे कम है, जो मेमोरी का प्रबंधन कर रहा है। jvm तब तक जीवित है जब तक उपयोगकर्ता धागा जीवित है, u डेमन थ्रेड को नहीं मार सकता। jjm डेमन थ्रेड्स को मारने के लिए जिम्मेदार है।


बहुत उलझन में है, और सभी ' गैर अनुक्रमिक हैं।
user207421

3

काम के उदाहरणों के साथ केवल कोड में बात करते हैं। मुझे ऊपर दिए गए उत्तर का उत्तर पसंद है लेकिन मुझे जो भी संदेह था, उसे दूर करने के लिए मैंने इसे थोड़ा बढ़ाया। मैंने इसे दो बार दौड़ाया, एक बार मज़दूर थ्रेड को सही (डेमॉन थ्रेड) पर सेट किया और दूसरी बार इसे झूठे (उपयोगकर्ता थ्रेड) पर सेट किया। यह पुष्टि करता है कि मुख्य धागा समाप्त हो जाने पर बहरा धागा समाप्त हो जाता है।

public class DeamonThreadTest {

public static void main(String[] args) {

    new WorkerThread(false).start();    //set it to true and false and run twice.

    try {
        Thread.sleep(7500);
    } catch (InterruptedException e) {
        // handle here exception
    }

    System.out.println("Main Thread ending");
    }
   }

   class WorkerThread extends Thread {

    boolean isDeamon;

    public WorkerThread(boolean isDeamon) {
        // When false, (i.e. when it's a user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main
        // thread terminates.
        this.isDeamon = isDeamon;
        setDaemon(isDeamon);
    }

    public void run() {
        System.out.println("I am a " + (isDeamon ? "Deamon Thread" : "User Thread (none-deamon)"));

        int counter = 0;

        while (counter < 10) {
            counter++;
            System.out.println("\tworking from Worker thread " + counter++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
        System.out.println("\tWorker thread ends. ");
    }
}



result when setDeamon(true)
=====================================
I am a Deamon Thread
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending

Process finished with exit code 0


result when setDeamon(false)
=====================================
I am a User Thread (none-deamon)
    working from Worker thread 0
    working from Worker thread 1
Main Thread ending
    working from Worker thread 2
    working from Worker thread 3
    working from Worker thread 4
    working from Worker thread 5
    working from Worker thread 6
    working from Worker thread 7
    working from Worker thread 8
    working from Worker thread 9
    Worker thread ends. 

Process finished with exit code 0

3

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

setDaemon(true)

3
वे आमतौर पर "सेवा प्रदाता" धागे के रूप में नहीं जाने जाते हैं।
user207421

1
और उनका उपयोग किसी भी कोड को निष्पादित करने के लिए किया जा सकता है। JVM 'उन्हें किसी भी समय मार नहीं सकता', लेकिन जब कोई गैर-डीमन थ्रेड नहीं चल रहा हो तो यह उन्हें मार देगा
user207421

@ ईजेपी शायद मैं गलत हूं लेकिन "यह उन्हें मार डालेगा" जब गैर-डीमन थ्रेड चल रहे हैं। जब एक धागा डेमॉन होता है, तो यह jvm को पकड़कर अलग नहीं चल रहा है जब तक कि यह पूरी तरह से निष्पादित नहीं होता है और अब ओएस स्तर पर प्रबंधित किया जाता है।
89n3ur0n

यह उन सभी को मार देगा जब सभी गैर-डेमन धागे बाहर निकल चुके हैं, और इससे पहले पिकोसकंड नहीं। निश्चित रूप से 'किसी भी समय' नहीं।
user207421

3

डेमन थ्रेड्स थ्रेड होते हैं जो पृष्ठभूमि में चलते हैं जब तक कि प्रक्रिया के अन्य गैर-डेमन थ्रेड्स चल रहे हैं। इस प्रकार, जब सभी गैर-डीमन धागे पूरे हो जाते हैं, तो डेमन थ्रेड्स समाप्त हो जाते हैं। गैर-डेमॉन थ्रेड के लिए एक उदाहरण मुख्य रनिंग थ्रेड है। थ्रेड setDaemon()शुरू होने से पहले विधि को कॉल करके एक थ्रेड को डेमॉन बनाया जाता है

अधिक संदर्भ के लिए: जावा में डेमॉन थ्रेड


2

मेरे लिए, उपयोगकर्ता धागे के लिए डेमन थ्रेड यह घर कीपर की तरह है। यदि सभी उपयोगकर्ता थ्रेड समाप्त हो जाते हैं, तो डेमन थ्रेड के पास कोई काम नहीं है और जेवीएम द्वारा मार दिया जाता है। मैंने इसे YouTube वीडियो में समझाया ।


2

अंतिम गैर-डेमॉन थ्रेड निष्पादन पूरा होने पर JVM कार्य को पूरा करेगा। डिफ़ॉल्ट रूप से, JVM नोंडोमन ​​के रूप में एक धागा बनाएगा, लेकिन हम थ्रेड को विधि की मदद से एक डेमॉन के रूप में बना सकते हैं setDaemon(true)। डेमन थ्रेड का एक अच्छा उदाहरण जीसी थ्रेड है जो सभी ननदों के धागे के पूरा होते ही अपना काम पूरा कर देगा।


कैसे हो सकता है कि जीसी धागा कैसे काम करता है? यदि प्रोग्राम का मुख्य धागा बहुत लंबा समय लेता है (मुख्य धागा समाप्त नहीं होता है) तो भी कचरा संग्रह नहीं चलता है?
कैलिकोडर

जैसा कि मैंने उल्लेख किया कि GC धागा अंतिम NON डेमन थ्रेड के अंत तक काम करेगा, इसे पूरा करेगा। कार्यक्रम का मुख्य धागा डेमॉन नहीं है क्योंकि हम जानते हैं कि जीसी धागा मुख्य धागा पूरा होने / मारे जाने के बाद काम को पूरा करेगा। मूल रूप से मैं कहना चाहता हूं कि प्रक्रिया पूरी होने पर डेमॉन थ्रेड (ओं) को समाप्त कर दिया जाएगा, और सभी गैर डेमन थ्रेड्स निष्पादित होने पर प्रक्रिया पूरी हो जाती है।
अरमान तुमनयन

डिफ़ॉल्ट रूप से एक धागे की डेमॉन स्थिति उसके माता-पिता से विरासत में मिली है।
user207421

-1

जब निर्माता धागा बाहर निकलता है तो डेमन थ्रेड मर जाते हैं।

गैर-डेमन थ्रेड्स (डिफ़ॉल्ट) मुख्य धागे की तुलना में अधिक समय तक रह सकते हैं।

if ( threadShouldDieOnApplicationEnd ) {
    thread.setDaemon ( true );
}
thread.start();

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

डेमॉन थ्रेड मर जाते हैं जब जेवीएम के रूप में अधिक चलने योग्य गैर-डेमन थ्रेड्स नहीं होते हैं। जावदोक को देखें। उत्तर पूरी तरह से गलत है।
user207421
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.