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




multithreading (16)

क्या कोई मुझे बता सकता है कि जावा में डेमॉन थ्रेड क्या हैं?


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

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

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

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

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

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

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


एक गलतफहमी मैं स्पष्ट करना चाहता हूं:

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

कुछ और अंक (संदर्भ: प्रैक्टिस में जावा कंसुरेंसी )

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

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

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


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


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

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

के लिए इस्तेमाल डेमॉन धागे क्या हैं?

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

इस तरह के धागे का एक सामान्य उदाहरण जावा कचरा कलेक्टर है

अभी और है...

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

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

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

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

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

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

1) JVM मौजूदा से पहले किसी भी डिमन थ्रेड को समाप्त करने की प्रतीक्षा नहीं करता है।

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


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

setDaemon(true)

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


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


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

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


डेमॉन धागे सभी के रूप में समझाया गया है, बाहर निकलने के लिए जेवीएम को बाधित नहीं करेगा, इसलिए मूल रूप से यह बाहर निकलने के दृष्टिकोण से आवेदन के लिए एक खुश धागा है।

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

विनम्र, मनीष


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


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

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

डेमॉन धागे का एक पठन है।


सभी उपरोक्त उत्तरों अच्छे हैं। अंतर को दर्शाने के लिए यहां एक साधारण छोटा कोड स्निपेट है। 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
            }
        }
    }
}




multithreading