জাভাতে ডেমন থ্রেড কী?


809

জাভাতে ডেমন থ্রেডগুলি কি কেউ আমাকে বলতে পারেন ?


20
Thread: Javadoc বর্ণনা কি তারা java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
ডেমন থ্রেডগুলির জন্য, যখন জেভিএম সমস্ত ডেমনের থ্রেড বন্ধ করে দেয় এই কারণেই ডেমন থ্রেডগুলি প্রায়শই ব্যবহার করা উচিত নয় কারণ সেগুলি পরিষ্কার করে না। উদাহরণস্বরূপ, কোনও আই / ও নিখুঁতভাবে প্রস্থান করবে এবং শেষ পর্যন্ত সমস্তভাবেই লিখবে / পড়বে না।
msj121

উত্তর:


631

ডেমন থ্রেড হ'ল একটি থ্রেড যা প্রোগ্রামটি শেষ হওয়ার পরে জেভিএমকে বের হতে বাধা দেয় না তবে থ্রেডটি এখনও চলছে। ডেমন থ্রেডের উদাহরণ হ'ল আবর্জনা সংগ্রহ।

থ্রেড শুরুর আগে আপনি ডিমন বৈশিষ্ট্যগুলি setDaemon(boolean)পরিবর্তন করতে পদ্ধতিটি ব্যবহার করতে পারেন Thread


210
উত্তরোত্তর জন্য, setDamon(boolean)থ্রেড শুরু হওয়ার আগে কেবল কল করা যেতে পারে। ডিফল্টরূপে থ্রেডটি তার পিতামাতার থ্রেডের ডেমন স্থিতি লাভ করে।
ধূসর

1
"প্রোগ্রামটি শেষ হয়ে গেলে জেভিএমকে বেরিয়ে আসতে বাধা দেয় না তবে থ্রেডটি এখনও চলছে" যখন @ সীতেশ বলে যে "জেভিএম কোনও অবশিষ্ট ডিমন থ্রেড পরিত্যাগ করে"। তাহলে কী জেভিএম প্রস্থান করলে ডেমন থ্রেডগুলি চলমান শেষ করে?
জেরাল্ড

23
@ জেরাল্ড, জেভিএম প্রস্থান করলে সমস্ত থ্রেড মারা যায়। বি_রব বলেছিলেন, "... প্রোগ্রাম শেষ হলে"। এর অর্থ কী, যদি প্রোগ্রামটি স্পষ্টভাবে জেভিএমকে হত্যা না করে, তবে শেষ নন -ডেমনের থ্রেডটি শেষ হলে JVM স্বয়ংক্রিয়ভাবে নিজেকে মেরে ফেলবে । সাধারণ থ্রেডগুলি "প্রোগ্রামটি শেষ হয়ে গেলে" সংজ্ঞায়িত করে। ডেমন থ্রেড না।
সলোমন আস্তে আস্তে

2
সুতরাং এই লাইনটি thread that does not prevent the JVM from exiting when the program finishes but the thread is still runningমূলত জেভিএম প্রক্রিয়াটি বোঝায় যে থ্রেডটি শুরু হয়েছিল তাতে ডেমন থ্রেড নির্বাহ শেষ হয়েছে কিনা তা বিবেচ্য নয়, যদি সমস্ত সাধারণ থ্রেডের সম্পাদনা শেষ হয়ে যায় তবে এটি নিজেই শেষ হবে।
ভড়গব

1
@ সলোমনস্লো জেভিএম শেষ হওয়ার পরে যখন এটি এখনও কাজ করছে তখন ডেমনের থ্রেড (উদাহরণস্বরূপ, কোনও আবর্জনা সংগ্রহকারী) হত্যার পরিণতিগুলি কী? ধন্যবাদ।
ভেঙ্কট রামকৃষ্ণন

340

আরও কয়েকটি পয়েন্ট (রেফারেন্স: অনুশীলনে জাভা কনসার্চেন্সি )

  • যখন একটি নতুন থ্রেড তৈরি করা হয় তখন এটি তার পিতামাতার ডেমন স্থিতি লাভ করে।
  • সমস্ত নন-ডেমন থ্রেডগুলি সমাপ্ত হলে, জেভিএম বন্ধ হয়ে যায়, এবং কোনও অবশিষ্ট ডিমন থ্রেড পরিত্যাগ করা হয় :

    • অবশেষে ব্লকগুলি কার্যকর করা হয় না ,
    • স্ট্যাকগুলি অবিরাম নয় - জেভিএম সবেমাত্র প্রস্থান করে।

    এই কারণে ডেমন থ্রেডগুলি অল্প পরিমাণে ব্যবহার করা উচিত এবং যে কোনও ধরণের I / O সম্পাদন করতে পারে এমন কাজের জন্য সেগুলি ব্যবহার করা বিপজ্জনক।


3
আই / ও'র জন্য ডেমন থ্রেডগুলি কেন ব্যবহার করা উচিত নয়? বাফারডাইটার্স ইত্যাদি সম্পর্কে উদ্বেগ প্রকাশ করা হচ্ছে না?
পল কেগার

4
@ পলক্যাজার হ্যাঁ, তারা কেবল লেখার / পড়ার মাঝখানে হাঁটুতে কেটে যেতে পারে।
ক্রাঙ্কার

52
দ্বিতীয় বিষয়টি বাজে কথা। যখন জেভিএম বন্ধ হয়ে যায়, সমস্ত থ্রেড মারা যায় এবং কোনও finallyব্লক কার্যকর করা হয় না, থ্রেডগুলি ডিমন হয় কিনা তা নির্বিশেষে। সুতরাং System.exit(…)আপনি যদি মনে করেন যে I / O করছে এমন থ্রেড চলছে। পার্থক্যটি হ'ল কেবলমাত্র ডেমন থ্রেডগুলি রেখে গেলে জেভিএম তার নিজস্ব সমাপ্তি ঘটায়।
হলগার

11
"স্ট্যাকগুলি অযৌক্তিক নয়" বলতে কী বোঝায়?
3

2
@ ɢʜʘʂʈʀɛɔʘɴ এইগুলি সহ " আনইন্ডিং
এএন

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
@ রাস গুড কোড স্নিপেট! যদিও আমাকে ওয়ার্কার ট্রেড ক্লাস স্থির হিসাবে সংজ্ঞায়িত করতে হয়েছিল।
xli

@xli আপনি কাজ করতে পারে নতুন DaemonTest () নতুন WorkerThread () শুরু () খুব
abhy

@ ভাল উদাহরণ। আমি অবগত ছিলাম যে ডিফল্টটি হ'ল "সেটডিমন (মিথ্যা)" যদি আপনি স্পষ্টভাবে "সেটডেমোন (সত্য)" সংজ্ঞায়িত না করেন
হুসিইন

96

ইউনিক্সের ditionতিহ্যগতভাবে ডেমন প্রক্রিয়াগুলি সেগুলি ছিল যা নিয়মিত পটভূমিতে চলছিল, অনেকটা উইন্ডোজের পরিষেবাদির মতো।

জাভাতে একটি ডেমন থ্রেড এমনটি যা জেভিএমকে বেরিয়ে আসতে বাধা দেয় না। বিশেষত JVM প্রস্থান করবে যখন কেবল ডিমন থ্রেড থাকবে। আপনি setDaemon()পদ্ধতিটি কল করে একটি তৈরি করুন Thread

একটি পড়া আছে ডেমন থ্রেড


3
আপনার লিঙ্কটি এই সময়ে মারা গেছে, সম্ভবত আপনি আপডেট করতে চান? যাইহোক, আপনার জন্য +1
জেসনউ

2
আমি ইউনিক্স এবং উইন্ডোজের মধ্যে তুলনা পছন্দ করি।
প্রেমরাজ

এখানে সেরা ব্যাখ্যা!
লাভমাউ

57

ডিমন থ্রেডগুলি ডিমন থ্রেডের মতো একই প্রক্রিয়ায় চলমান অন্যান্য থ্রেড বা অবজেক্টগুলির জন্য পরিষেবা সরবরাহকারীর মতো। ডেমন থ্রেডগুলি ব্যাকগ্রাউন্ড সমর্থনকারী কার্যগুলির জন্য ব্যবহৃত হয় এবং কেবল তখনই প্রয়োজন যখন সাধারণ থ্রেডগুলি কার্যকর করা হয়। যদি স্বাভাবিক থ্রেড চলমান না থাকে এবং অবশিষ্ট থ্রেডগুলি ডেমন থ্রেড হয় তবে দোভাষী দেরী হয়।

উদাহরণস্বরূপ, হটজাভা ব্রাউজারটি ফাইল সিস্টেম বা নেটওয়ার্ক থেকে যে কোনও থ্রেডের প্রয়োজন হয় তার জন্য চিত্র আনতে "ইমেজ ফেচার" নামে চারটি পর্যন্ত ডেমন থ্রেড ব্যবহার করে।

ডেমন থ্রেডগুলি সাধারণত আপনার অ্যাপ্লিকেশন / অ্যাপলেটটির জন্য পরিষেবাগুলি সম্পাদন করতে ব্যবহৃত হয় (যেমন "ফ্রিডল বিটস" লোড করা)। ব্যবহারকারীর থ্রেড এবং ডেমন থ্রেডগুলির মধ্যে মূল পার্থক্যটি হ'ল যখন সমস্ত ব্যবহারকারী থ্রেড বন্ধ হয়ে যায় তখন JVM কেবলমাত্র একটি প্রোগ্রাম বন্ধ করে দেবে। ডায়মন থ্রেডগুলি JVM দ্বারা বন্ধ করা হয় যখন ব্যবহারকারীর মূল থ্রেড সহ কোনও ব্যবহারকারী থ্রেড চলমান থাকে না।

setDaemon (সত্য / মিথ্যা)? এই পদ্ধতিটি থ্রেডটি ডেমন থ্রেড উল্লেখ করার জন্য ব্যবহৃত হয়।

পাবলিক বুলিয়ান কি ডেমন ()? এই পদ্ধতিটি থ্রেডটি ডেমন থ্রেড কিনা তা নির্ধারণ করতে ব্যবহৃত হয়।

উদাহরণ:

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 ডেমন থ্রেডগুলি থামায়। সুতরাং ডিমন থ্রেডগুলি প্রয়োগ করার জন্য ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, সমস্ত ব্যবহারকারী থ্রেড বন্ধ হয়ে যাওয়ার সাথে সাথে থাইটি JVM দ্বারা থ্রেড বন্ধ করে দেওয়া হয় a

যদি আপনি System.exit () কল করেন তবে থ্রেডটি ডেমন থ্রেড নির্বিশেষে কোনও ব্লক কার্যকর করা হবে না। প্রকৃতপক্ষে পরিশেষে ব্লক এমনকি ডেমন থ্রেডের মধ্যে মৃত্যুদন্ড কার্যকর করা হয় পরে গত ব্যবহারকারী থ্রেড বন্ধ করলে জেভিএম এখনো থ্রেড মেরে ফেলেনি
benez

5
একটি ডেমন থ্রেড তার তৈরি থ্রেড হিসাবে একই অগ্রাধিকারে কার্যকর করে, যদি না এটি শুরু করার আগে পরিবর্তন করা হয়। ডেমন থ্রেডগুলি অগত্যা 'পরিষেবা সরবরাহকারী' বা উইন্ডোজ পরিষেবা বা এখানে বর্ণিত অন্য কিছু নয়: এগুলি কেবল থ্রেড যা জেভিএমকে বেরিয়ে আসতে বাধা দেয় না। সময়কাল।
ব্যবহারকারী 207421

35

একজন ডেমন থ্রেড একটি থ্রেড করা হয় যে বিবেচনা হ্যান্ডলিং অনুরোধ বা বিভিন্ন chronjobs যে একটি অ্যাপ্লিকেশন মধ্যে উপস্থিত মতো পটভূমিতে কিছু কাজ করছে।

যখন আপনার প্রোগ্রামটি কেবল আছে ডেমন থ্রেডগুলি অবশিষ্ট রয়েছে এটি প্রস্থান করবে। এর কারণ সাধারণত এই থ্রেডগুলি একসাথে সাধারণ থ্রেডের সাথে কাজ করে এবং ইভেন্টগুলির পটভূমি হ্যান্ডলিং সরবরাহ করে।

আপনি নির্দিষ্ট করতে পারেন যে একটি Threadএকটি হল ডেমন ব্যবহার করে এক setDaemonপদ্ধতি, তারা সাধারণত প্রস্থান না, তন্ন তন্ন তারা বিঘ্নিত হয়েছে .. তারা শুধু যখন আবেদন স্টপ বন্ধ।


1
এটি একটি ডেমন থ্রেড কারণ এবং এটি 'ডেমন' এর অর্থ। আপনার যুক্তি আবার সামনে।
ব্যবহারকারী 207421

15

একটি ভুল ধারণা আমি স্পষ্ট করতে চাই:

  • ধরে নিন যে যদি ব্যবহারকারী থ্রেডের মধ্যে ডেমন থ্রেড (বলুন বি) তৈরি করা হয়; তারপরে এই ব্যবহারকারীর থ্রেড / পিতামাতার থ্রেড (এ) এর শেষের ফলে এটি তৈরি করা ডেমন থ্রেড / চাইল্ড থ্রেড (বি) শেষ হবে না; প্রদত্ত কেবলমাত্র ব্যবহারকারী থ্রেডই চলমান is
  • সুতরাং থ্রেড শেষ হওয়ার সাথে পিতামাতার সাথে কোনও সম্পর্ক নেই। সমস্ত ডেমন থ্রেড (এটি যেখানে তৈরি করা হয়েছে তা নির্বিশেষে) একবারে কোনও লাইভ ব্যবহারকারী থ্রেড না থাকায় এটি শেষ হবে এবং যার ফলে জেভিএম বন্ধ হয়ে যায় termin
  • এমনকি এটি উভয়ের ক্ষেত্রেই সত্য (পিতা / মাতা) ডেমন থ্রেড।
  • কোনও শিশু থ্রেড যদি ডেমন থ্রেড থেকে তৈরি হয় তবে এটি ডিমন থ্রেডও। এটির জন্য কোনও স্পষ্ট ডেমন থ্রেড পতাকা সেটিংসের প্রয়োজন হবে না। একইভাবে যদি কোনও শিশু থ্রেড কোনও ব্যবহারকারী থ্রেড থেকে তৈরি হয় তবে এটিও একটি ব্যবহারকারী থ্রেড, যদি আপনি এটি পরিবর্তন করতে চান তবে সেই শিশু থ্রেড শুরুর আগে সুস্পষ্ট ডেমোন পতাকাঙ্কিত সেটিংসের প্রয়োজন।

এটি কোনও কিছুই থেকে উদ্ধৃত হয়নি। উদ্ধৃত নয় এমন পাঠ্যের জন্য উদ্ধৃতি বিন্যাস ব্যবহার করবেন না। 'উদ্ধৃতি' এর প্রথম অনুচ্ছেদটি ভুল, এবং দ্বিতীয়টির বিপরীতে।
ব্যবহারকারী 207421

@ ইজেপি এটি পেয়েছে, সুতরাং প্রত্যেককেই নিজের লোকের মতো এখানে নয়, অন্য লোককে উদ্ধৃতি দিতে হবে। বা আমাদের নিজস্ব কোথাও কোথাও আছে এখানে এখানে নির্দেশ?
কানগাভেলু সুগুমার

হ্যাঁ, যদি আপনি কাউকে উদ্ধৃত আপনি তাদের cite শুধু কোথাও মতো বিট আপনি উদ্ধৃত করেন নি কেউ এটিকে যেন আপনি ফরম্যাট করা হবে না করতে হবে। আমি আপনার দ্বিতীয় বাক্যটির মাথা বা লেজ বানাতে পারি না।
ব্যবহারকারী 207421

12

ডেমন থ্রেড এবং ব্যবহারকারীর থ্রেড। সাধারণত প্রোগ্রামার দ্বারা তৈরি সমস্ত থ্রেড হ'ল ব্যবহারকারীর থ্রেড (যদি না আপনি এটিকে ডিমন হিসাবে নির্দিষ্ট করেন বা আপনার প্যারেন্ট থ্রেডটি ডেমন থ্রেড না থাকে)। ব্যবহারকারীর থ্রেড বলতে সাধারণত আমাদের প্রোগ্রাম কোডটি চালানো হয়। সমস্ত ব্যবহারকারী থ্রেড সমাপ্ত না হলে JVM সমাপ্ত হবে না।


10

জাভাতে একটি বিশেষ ধরণের থ্রেড থাকে যা ডেমন থ্রেড বলে।

  • খুব কম অগ্রাধিকার।
  • একই প্রোগ্রামের অন্য কোনও থ্রেড চলমান না থাকলে কেবল কার্যকর করে utes
  • জেভিএম এই থ্রেডগুলি সমাপ্ত করে প্রোগ্রামটি শেষ করে, যখন ডেমন থ্রেডগুলি কোনও প্রোগ্রামে চলমান থাকে।

ডেমন থ্রেডগুলি কীসের জন্য ব্যবহৃত হয়?

সাধারণ থ্রেডের জন্য সাধারণত পরিষেবা সরবরাহকারী হিসাবে ব্যবহৃত হয়। সাধারণত একটি অসীম লুপ থাকে যা পরিষেবার অনুরোধের জন্য অপেক্ষা করে বা থ্রেডের কার্য সম্পাদন করে। তারা গুরুত্বপূর্ণ কাজ করতে পারে না। (কারণ আমরা জানি না যে তারা কখন সিপিইউ সময় পাবে এবং অন্য কোনও থ্রেড না চললে তারা যে কোনও সময় শেষ করতে পারে))

এই ধরণের থ্রেডগুলির একটি সাধারণ উদাহরণ হ'ল জাভা আবর্জনা সংগ্রহকারী

আরো আছে...

  • setDaemon()পদ্ধতিটি কল করার আগে আপনি কেবল পদ্ধতিটি কল করেন start()। থ্রেডটি একবার চলার পরে, আপনি এর ডেমন স্থিতিটি পরিবর্তন করতে পারবেন না।
  • isDaemon()কোনও থ্রেডটি ডেমন থ্রেড বা ব্যবহারকারীর থ্রেড কিনা তা পরীক্ষা করতে পদ্ধতি ব্যবহার করুন ।

8
-1, আমি বিশ্বাস করি না যে ডেমন থ্রেড সহজাতভাবে নিম্ন-অগ্রাধিকারযুক্ত। অবশ্যই এমন কোনও ডকুমেন্টেশন আমি দেখিনি। এছাড়াও এই তাই উত্তর দাবি অগ্রাধিকার এবং ডেমন-অন্তরীপ লম্ব হয় যে: stackoverflow.com/a/10298353/839128
MikeFHay

5
ডেমন থ্রেডগুলির অগ্রাধিকারের সাথে কিছুই করার নেই। আপনার কাছে উচ্চ অগ্রাধিকারপ্রাপ্ত ডেমন থ্রেড বা নিম্ন অগ্রাধিকার নন-ডেমন থ্রেড থাকতে পারে।
ধূসর

একটি ডেমন থ্রেড প্রাথমিকভাবে তার তৈরি থ্রেডের সমান অগ্রাধিকার পায়।
ব্যবহারকারী 207421

"" একই প্রোগ্রামটির অন্য কোনও থ্রেড চলমান না থাকলে "কেবলমাত্র কার্যকর করা হয়" বিবৃতিটি বিভ্রান্তিকর হয়।
ফ্রেড্রিক গাউস

9

ডেমন থ্রেড সহকারীদের মতো। নন-ডেমন থ্রেডগুলি সামনের পারফর্মারদের মতো। সহায়করা একটি কাজ সম্পূর্ণ করতে পারফর্মারদের সহায়তা করে। যখন কাজটি সম্পন্ন হয়, আর অভিনয় করার জন্য পারফর্মারদের কোনও সাহায্যের প্রয়োজন হয় না। যেহেতু কোনও সহায়তার প্রয়োজন নেই, সাহায্যকারীরা জায়গা ছেড়ে চলে যায়। সুতরাং নন-ডেমন থ্রেডগুলির কাজ শেষ হলে, ডেমন থ্রেডগুলি মার্চ আপ করে।


5

ডেমন থ্রেডটি একটি সাধারণ থ্রেডের মতোই থাকে তবে এ ছাড়া জভিএম কেবল তখনই বন্ধ হয়ে যাবে যখন অন্যান্য নন-ডিমন থ্রেড বিদ্যমান থাকবে না। আপনার অ্যাপ্লিকেশনটির জন্য পরিষেবাগুলি সম্পাদন করতে ডেমন থ্রেডগুলি সাধারণত ব্যবহৃত হয়।


5

জাভাতে ডেমন থ্রেড হ'ল সেই থ্রেড যা ব্যাকগ্রাউন্ডে চলে এবং বেশিরভাগ জেভিএম দ্বারা আবর্জনা সংগ্রহ এবং অন্যান্য ঘর রক্ষণাবেক্ষণের মতো পটভূমি কাজ সম্পাদনের জন্য তৈরি করা হয়।

পয়েন্ট নোট করুন:

  1. মূল থ্রেড দ্বারা নির্মিত যে কোনও থ্রেড, যা জাভাতে মূল পদ্ধতিটি চালিত হয় তা হ'ল ডিফল্ট নন ডিমন কারণ থ্রেড থ্রেড থেকে তার ডেমন প্রকৃতির উত্তরাধিকার সূত্রে প্রাপ্ত হয় যা এটি প্যারেন্ট থ্রেড তৈরি করে এবং যেহেতু মূল থ্রেড একটি নন ডিমন থ্রেড, তাই এটি থেকে তৈরি অন্য কোনও থ্রেড হবে সেটডেমনকে (সত্য) কল করে স্পষ্টভাবে ডেমন তৈরি না করা অবধি ডেমন থাকুন।

  2. Thread.setDaemon (সত্য) একটি থ্রেড ডিমন তৈরি করে তবে জাভাতে থ্রেড শুরু করার আগে এটি কেবল কল করা যেতে পারে। সংশ্লিষ্ট থ্রেড ইতিমধ্যে শুরু এবং চলমান থাকলে এটি অবৈধ থ্রেডস্টেটএক্সপশন নিক্ষেপ করবে।

জাভায় ডেমন এবং নন-ডেমন থ্রেডের মধ্যে পার্থক্য:

1) জেভিএম কোনও ডেমন থ্রেড বিদ্যমান থাকার আগে শেষ হওয়ার অপেক্ষা করে না।

2) ডাইমন থ্রেডটি ইউজার থ্রেডের চেয়ে আলাদাভাবে চিকিত্সা করা হয় যখন জেভিএম সমাপ্ত হয়, অবশেষে ব্লকগুলি ডাকা হয় না, স্ট্যাকগুলি অযৌক্তিক হয় না এবং জেভিএম কেবল প্রস্থান করে।


5

জাভাতে, ডেমন থ্রেডস থ্রেডের অন্যতম ধরণ যা জাভা ভার্চুয়াল মেশিন (জেভিএম )টিকে বেরোতে বাধা দেয় না। ডেমন থ্রেডের মূল উদ্দেশ্যটি হ'ল বিশেষত কিছু নিয়মিত পর্যায়ক্রমিক কাজ বা কাজের ক্ষেত্রে পটভূমি কাজ সম্পাদন করা। জেভিএম প্রস্থান করার সাথে সাথে ডিমন থ্রেডও মারা যায়।

একটি সেট করে thread.setDaemon(true), একটি থ্রেড একটি ডিমন থ্রেড হয়ে যায়। তবে আপনি কেবল থ্রেড শুরুর আগে এই মানটি সেট করতে পারেন।


থ্রেডের অন্যান্য ধরণের কী তা করে? উ: কিছুই নয়। ডেমন থ্রেড এবং নন-ডেমন থ্রেড, পিরিয়ড রয়েছে। এটি একটি বাইনারি, দুটি রাজ্য।
ব্যবহারকারী 207421

5

ব্যবহারকারীর থ্রেডের অস্তিত্বের কারণে jvm প্রস্থানের ক্ষেত্রে ডেমন থ্রেডগুলির আচরণের পরীক্ষা করার উদাহরণ এখানে।

দয়া করে নীচের আউটপুটে দ্বিতীয় শেষ লাইনটি নোট করুন, যখন মূল থ্রেডটি প্রস্থান করা হবে, ডেমন থ্রেডটিও মারা গিয়েছিল এবং অবশেষে ব্লকের মধ্যে নির্বাহিত 9 বিবৃতিটি প্রিন্ট করে না । এর অর্থ হ'ল ডেমোন থ্রেডের অবশেষে ব্লকের মধ্যে বন্ধ হওয়া কোনও আই / ও রিসোর্স বন্ধ হবে না যদি ব্যবহারকারী থ্রেডের অস্তিত্বের কারণে জেভিএম প্রস্থান করে।

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

ডেমন থ্রেডগুলি যেমন প্রত্যেকের ব্যাখ্যা অনুসারে, JVM প্রস্থান করতে বাধা দেয় না, তাই মূলত এটি প্রস্থান দৃষ্টিকোণ থেকে অ্যাপ্লিকেশনটির জন্য একটি সুখী থ্রেড।

আমি যখন কোনও তৃতীয় পক্ষের সার্ভার / বা জেএমএসে ডেটা পুশ করার মতো একটি এপিআই সরবরাহ করছি তখন ডেমন থ্রেডগুলি যুক্ত করতে চান, আমার ক্লায়েন্ট জেভিএম স্তরে সামগ্রিক ডেটা সংগ্রহ করতে হবে এবং তারপরে পৃথক থ্রেডে জেএমএসে প্রেরণ করতে হবে। আমি এই থ্রেডটিকে ডেমন থ্রেড হিসাবে তৈরি করতে পারি, যদি এটি সার্ভারে ধাক্কা দেওয়া বাধ্যতামূলক ডেটা না হয়। এই জাতীয় ডেটা লগ পুশ / সমষ্টিকরণের মতো।

শুভেচ্ছা, মনীষ


এখানে জাভাতে ডেমন থ্রেড দেখানো একটি সাধারণ প্রোগ্রাম রয়েছে। জার্নাদেড.কম
পঙ্কজ

4

ডেমন থ্রেডটি ডেমন প্রক্রিয়াটির মতো যা সম্পদ পরিচালনার জন্য দায়ী, জাভা ভিএম দ্বারা ব্যবহারকারী থ্রেড পরিবেশন করতে একটি ডেমন থ্রেড তৈরি করা হয়। ইউনিক্সের জন্য সিস্টেম আপডেট করার উদাহরণ, ইউনিক্স হ'ল ডেমন প্রক্রিয়া। ডেমন থ্রেডের চাইল্ড সর্বদা ডেমন থ্রেড হয়, তাই ডিফল্টভাবে ডেমন মিথ্যা হয় "আপনি" isDaemon () "পদ্ধতিটি ব্যবহার করে থ্রেড ডিমন বা ব্যবহারকারী হিসাবে পরীক্ষা করতে পারেন। সুতরাং ডেমন থ্রেড বা ডেমন প্রক্রিয়া মূলত সম্পদ পরিচালনার জন্য দায়বদ্ধ। উদাহরণস্বরূপ আপনি যখন জেভিএম শুরু করেন সেখানে আবর্জনা সংগ্রহকারী চলমান থাকে যা ডেমন থ্রেড যার অগ্রাধিকার 1 হ'ল সর্বনিম্ন, যা মেমরি পরিচালনা করে। jvm যতক্ষণ না ব্যবহারকারী থ্রেড বেঁচে থাকবে ততক্ষণ আপনি ডিমন থ্রেডকে হত্যা করতে পারবেন না j jvm ডেমন থ্রেডগুলি মারতে দায়বদ্ধ।


খুব বিভ্রান্ত, এবং সমস্ত ' তাই'র নন সিকুইটার রয়েছে।
ব্যবহারকারী 207421

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

ডিমন থ্রেডগুলি সাধারণত "পরিষেবা সরবরাহকারী" থ্রেড হিসাবে পরিচিত। এই থ্রেডগুলি প্রোগ্রাম কোডটি ব্যবহার না করে সিস্টেম কোড ব্যবহার করা উচিত। এই থ্রেডগুলি আপনার কোডের সমান্তরালে চলে তবে জেভিএম এগুলি যে কোনও সময় হত্যা করতে পারে। যখন জেভিএম কোনও ব্যবহারকারী থ্রেড না পেয়ে এটি থামিয়ে দেয় এবং সমস্ত ডিমন থ্রেড তাত্ক্ষণিকভাবে বন্ধ হয়ে যায়। আমরা ডিমনটিতে নন-ডেমন থ্রেড সেট করে এটি ব্যবহার করতে পারি:

setDaemon(true)

3
এগুলি 'পরিষেবা সরবরাহকারী' থ্রেড হিসাবে সাধারণত পরিচিত হয় না।
ব্যবহারকারী 207421

1
এবং এগুলি যে কোনও কোড কার্যকর করতে ব্যবহার করা যেতে পারে। জেভিএম 'তাদের কোনও সময় হত্যা করতে পারে না', তবে কোনও ডেমন থ্রেড চলমান থাকলে এটি তাদের হত্যা করবে
ব্যবহারকারী 207421

@ জেজেপি সম্ভবত আমি ভুল কিন্তু "ডেটা তাদের মেরে ফেলবে" যখন নন-ডেমন থ্রেড চলবে। যখন কোনও থ্রেড ডিমন হয়, এটি সম্পূর্ণরূপে সঞ্চালিত না হওয়া এবং এখন ওএস স্তরে পরিচালিত হওয়া অবধি jvm কে ধরে রেখে পৃথকভাবে চলমান নয়।
89n3ur0n

এটি তাদের মেরে ফেলবে যখন সমস্ত নন-ডেমন থ্রেড বেরিয়ে এসেছিল এবং পিকসেকেন্ডের আগে নয়। অবশ্যই 'কোনও সময়' নয়।
ব্যবহারকারী 207421

3

ডিমন থ্রেডগুলি এমন থ্রেড যা পটভূমিতে চালিত হয় যতক্ষণ না প্রক্রিয়াটির অন্যান্য নন-ডেমন থ্রেড চলমান থাকে। সুতরাং, যখন সমস্ত অ-ডেমন থ্রেডগুলি সম্পূর্ণ হয়, ডেমন থ্রেডগুলি সমাপ্ত হয়। নন-ডেমন থ্রেডের একটি উদাহরণ হ'ল মেইন চালিত থ্রেড। ডায়মনকে ফোন করে একটি থ্রেড তৈরি করা হয়setDaemon() শুরু হওয়ার আগে পদ্ধতিটিকে হয়

আরও রেফারেন্সের জন্য: জাভায় ডেমন থ্রেড


2

আমার জন্য, ডেমন থ্রেড এটি ব্যবহারকারীর থ্রেডের জন্য গৃহকর্তার মতো। যদি সমস্ত ব্যবহারকারীর থ্রেডগুলি সমাপ্ত হয়, ডেমন থ্রেডের কোনও কাজ নেই এবং জেভিএম দ্বারা নিহত হয়েছিল। আমি এটি ইউটিউব ভিডিওতে ব্যাখ্যা করেছি ।


2

শেষ নন-ডেমন থ্রেড কার্যকর করা শেষ হলে JVM কাজটি সম্পাদন করবে। ডিফল্টরূপে, জেভিএম নোডেমোন হিসাবে একটি থ্রেড তৈরি করবে তবে আমরা পদ্ধতির সাহায্যে থ্রেডকে ডেমন হিসাবে তৈরি করতে পারি setDaemon(true)। ডেমন থ্রেডের একটি ভাল উদাহরণ হ'ল জিসি থ্রেড যা সমস্ত ননডেমোন থ্রেডগুলি সম্পন্ন হওয়ার সাথে সাথে তার কাজ শেষ করবে।


জিসি থ্রেড কীভাবে কাজ করবে তা কীভাবে হতে পারে? প্রোগ্রামের মূল থ্রেডটি খুব দীর্ঘ সময় নেয় (মূল থ্রেডটি শেষ হয় না) এমনকি আবর্জনা সংগ্রহও চলবে না?
ক্যালিকোডার

আমি যেমন উল্লেখ করেছি যে জিসি থ্রেডটি শেষ অনন ডেমনের থ্রেডের শেষ পর্যন্ত এটি কার্যকর করবে it's প্রোগ্রামটির মূল থ্রেডটি ডেমন নয় কারণ আমরা জানি যে জিসি থ্রেড মূল থ্রেডটি সম্পূর্ণ / নিহত হওয়ার পরে কাজটি সম্পন্ন করবে। মূলত আমি বলতে চাই যে প্রক্রিয়াটি শেষ হয়ে গেলে ডেমন থ্রেডগুলি সমাপ্ত হবে এবং সমস্ত ডেমন থ্রেড কার্যকর করা হলে প্রক্রিয়াটি সমাপ্ত হবে।
আরমান তুমানিয়ান

ডিফল্টরূপে থ্রেডের ডেমন স্থিতিটি তার পিতামাতার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
ব্যবহারকারী 207421

-1

স্রষ্টার থ্রেডটি প্রস্থান করলে ডেমন থ্রেডগুলি মারা যায়।

নন-ডেমন থ্রেড (ডিফল্ট) এমনকি মূল থ্রেডের চেয়েও বেশি সময় বেঁচে থাকতে পারে।

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

এটা ভুল. এটি স্রষ্টার থ্রেড সম্পর্কে নয়। যদি কোনও অ-ব্যবহারকারীর থ্রেড চলমান থাকে তবে ডেমন থ্রেডগুলি চলতে থাকবে। ফোরগ্রাউন্ড থ্রেড যা ডেমন থ্রেড তৈরি করে এটি সহজেই পরীক্ষা করা যায়। অগ্রভাগের থ্রেডটি joinএড হওয়ার পরেও মূল থ্রেড যতক্ষণ চলবে ততক্ষণ ডিমন থাকবে।
হুবার্ট গ্রেজস্কোইয়াক

ডিভিমন থ্রেডগুলি মারা যায় যখন জেভিএম আর চালানোর যোগ্য নন-ডেমন থ্রেড হিসাবে থাকবে। জাভাদোক দেখুন। উত্তর সম্পূর্ণ ভুল।
ব্যবহারকারী 207421
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.