development

Java의 데몬 스레드는 무엇입니까?

big-blog 2020. 9. 29. 08:07
반응형

Java의 데몬 스레드는 무엇입니까?


아무도 Java에 어떤 데몬 스레드가 있는지 말해 줄 수 있습니까?


데몬 스레드는 프로그램이 완료되었지만 스레드가 여전히 실행 중일 때 JVM이 종료되는 것을 방지하지 않는 스레드입니다. 데몬 스레드의 예는 가비지 컬렉션입니다.

스레드가 시작되기 전에이 setDaemon(boolean)메서드를 사용하여 Thread데몬 속성 을 변경할 수 있습니다 .


몇 가지 추가 사항 (참조 : Java Concurrency in Practice )

  • 새 스레드가 생성되면 부모의 데몬 상태를 상속합니다.
  • 모든 비 데몬 스레드가 완료되면 JVM이 중지되고 나머지 데몬 스레드가 모두 중단됩니다 .

    • finally 블록은 실행되지 않습니다 .
    • 스택이 풀리지 않고 JVM이 종료됩니다.

    이러한 이유로 데몬 스레드는 드물게 사용해야하며 모든 종류의 I / O를 수행 할 수있는 작업에 사용하는 것은 위험합니다.


위의 모든 답변이 좋습니다. 다음은 차이점을 설명하기위한 간단한 코드 스 니펫입니다. 에서 true 및 false의 각 값으로 시도해보십시오 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
            }
        }
    }
}

전통적으로 UNIX의 데몬 프로세스는 Windows의 서비스와 마찬가지로 백그라운드에서 지속적으로 실행되는 프로세스였습니다.

Java의 데몬 스레드는 JVM이 종료되는 것을 막지 않는 스레드입니다. 특히 데몬 스레드 만 남아있을 때 JVM이 종료됩니다. 에서 setDaemon()메서드를 호출하여 만듭니다 Thread.

데몬 스레드를 읽어보십시오 .


데몬 스레드는 데몬 스레드와 동일한 프로세스에서 실행되는 다른 스레드 또는 개체에 대한 서비스 공급자와 같습니다. 데몬 스레드는 백그라운드 지원 작업에 사용되며 일반 스레드가 실행되는 동안에 만 필요합니다. 정상 스레드가 실행 중이 아니고 나머지 스레드가 데몬 스레드이면 인터프리터가 종료됩니다.

예를 들어, HotJava 브라우저는 "Image Fetcher"라는 이름의 데몬 스레드를 최대 4 개 사용하여 파일 시스템이나 네트워크에서 이미지를 가져와 필요한 스레드에 대해 이미지를 가져옵니다.

데몬 스레드는 일반적으로 응용 프로그램 / 애플릿에 대한 서비스를 수행하는 데 사용됩니다 (예 : "피 들리 비트"로드). 사용자 스레드와 데몬 스레드의 핵심 차이점은 JVM이 모든 사용자 스레드가 종료 된 경우에만 프로그램을 종료한다는 것입니다. 데몬 스레드는 기본 실행 스레드를 포함하여 더 이상 실행중인 사용자 스레드가 없을 때 JVM에 의해 종료됩니다.

setDaemon (true / false)? 이 메소드는 스레드가 데몬 스레드임을 지정하는 데 사용됩니다.

공개 부울 isDaemon ()? 이 메소드는 스레드가 데몬 스레드인지 아닌지를 판별하는 데 사용됩니다.

예 :

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>

데몬 스레드 응용 프로그램에서 존재할 수 처리 요청이나 다양한 chronjobs 같은 배경에서 일부 작업을하고있는 것으로 간주 스레드입니다.

프로그램에 데몬 스레드남아 있으면 종료됩니다. 일반적으로 이러한 스레드는 일반 스레드와 함께 작동하고 이벤트의 백그라운드 처리를 제공하기 때문입니다.

메소드 를 사용하여 Threada가 데몬 임을 지정할 수 있습니다. setDaemon일반적으로 종료되지 않으며 중단되지도 않습니다. 응용 프로그램이 중지 될 때만 중지됩니다.


데몬 (컴퓨팅)의 정의 :

인쇄 스풀링 및 파일 전송과 같은 서비스에 대한 요청을 처리하고 필요하지 않은 경우 휴면 상태 인 백그라운드 프로세스입니다.

—— 출처 : Oxford Dictionary의 영어

Java의 데몬 스레드는 무엇입니까?

  • 데몬 스레드는 흐름 사이에 언제든지 종료 될 수 있으며, 데몬이 아닌 사용자 스레드는 완전히 실행됩니다.
  • 데몬 스레드는 다른 비 데몬 스레드가 실행되는 동안 백그라운드에서 간헐적으로 실행되는 스레드입니다.
  • 모든 비 데몬 스레드가 완료되면 데몬 스레드가 자동으로 종료됩니다.
  • 데몬 스레드는 동일한 프로세스에서 실행되는 사용자 스레드에 대한 서비스 공급자입니다.
  • JVM은 실행 중 상태에서 완료되는 데몬 스레드에 대해 신경 쓰지 않으며, 최종적으로 블록도 실행하도록 허용하지 않습니다. JVM은 우리가 만든 비 데몬 스레드를 선호합니다.
  • 데몬 스레드는 Windows에서 서비스 역할을합니다.
  • JVM은 모든 사용자 스레드 (데몬 스레드와 달리)가 종료되면 데몬 스레드를 중지합니다. 따라서 데몬 스레드는 예를 들어 모든 사용자 스레드가 중지되는 즉시 JVM에 의해 스레드가 중지되는 모니터링 기능을 구현하는 데 사용할 수 있습니다.

한 가지 오해를 명확히하고 싶습니다.

  • 데몬 스레드 (예 : B)가 사용자 스레드 (예 : A) 내에 생성되었다고 가정합니다. 이 사용자 스레드 / 상위 스레드 (A)의 종료는 생성 한 데몬 스레드 / 하위 스레드 (B)를 종료하지 않습니다. 제공된 사용자 스레드는 현재 실행중인 유일한 스레드입니다.
  • 따라서 스레드 종료에는 부모-자식 관계가 없습니다. 모든 데몬 스레드 (생성 된 위치에 관계없이)는 단일 라이브 사용자 스레드가없고 이로 인해 JVM이 종료되면 종료됩니다.
  • 이것은 (상위 / 하위) 모두 데몬 스레드에 해당됩니다.
  • 데몬 스레드에서 생성 된 자식 스레드는 데몬 스레드이기도합니다. 명시적인 데몬 스레드 플래그 설정이 필요하지 않습니다. 마찬가지로 사용자 스레드에서 생성 된 자식 스레드가 사용자 스레드 인 경우 변경하려면 해당 자식 스레드를 시작하기 전에 명시적인 데몬 플래그 설정이 필요합니다.

데몬 스레드 및 사용자 스레드. 일반적으로 프로그래머가 만든 모든 스레드는 사용자 스레드입니다 (데몬으로 지정하거나 부모 스레드가 데몬 스레드 인 경우 제외). 사용자 스레드는 일반적으로 프로그램 코드를 실행하기위한 것입니다. JVM은 모든 사용자 스레드가 종료되지 않는 한 종료되지 않습니다.


Java에는 데몬 스레드 라는 특별한 종류의 스레드가 있습니다.

  • 매우 낮은 우선 순위.
  • 동일한 프로그램의 다른 스레드가 실행되고 있지 않을 때만 실행됩니다.
  • JVM은 데몬 스레드가 프로그램에서 실행중인 유일한 스레드 인 경우 이러한 스레드를 완료하는 프로그램을 종료합니다.

데몬 스레드는 무엇에 사용됩니까?

일반적으로 일반 스레드의 서비스 공급자로 사용됩니다. 일반적으로 서비스 요청을 기다리거나 스레드의 작업을 수행하는 무한 루프가 있습니다. 그들은 중요한 일을 할 수 없습니다. (왜냐하면 CPU 시간이 언제 나올지 모르고 실행중인 다른 스레드가 없으면 언제든지 완료 할 수 있기 때문입니다.)

이러한 종류의 스레드에 대한 일반적인 예는 Java 가비지 수집기 입니다.

더있다...

  • setDaemon()메서드를 호출하기 전에 메서드를 호출합니다 start(). 스레드가 실행되면 데몬 상태를 수정할 수 없습니다.
  • isDaemon()메소드를 사용 하여 스레드가 데몬 스레드인지 사용자 스레드인지 확인합니다.

데몬 스레드는 도우미와 같습니다. Non-Daemon 스레드는 프론트 퍼포머와 같습니다. 어시스턴트는 공연자가 작업을 완료하도록 도와줍니다. 작업이 완료되면 공연자가 더 이상 수행하는 데 도움이 필요하지 않습니다. 도움이 필요하지 않기 때문에 조수가 그 자리를 떠납니다. 따라서 Non-Daemon 스레드의 작업이 끝나면 Daemon 스레드가 행진합니다.


데몬 스레드는 다른 비 데몬 스레드가 존재하지 않을 때만 JVM이 종료된다는 점을 제외하면 일반 스레드와 같습니다. 데몬 스레드는 일반적으로 애플리케이션에 대한 서비스를 수행하는 데 사용됩니다.


Java의 데몬 스레드는 백그라운드에서 실행되며 대부분 가비지 수집 및 기타 하우스 키핑 작업과 같은 백그라운드 작업을 수행하기 위해 JVM에 의해 생성되는 스레드입니다.

참고 사항 :

  1. Java에서 메인 메소드를 실행하는 메인 스레드에 의해 생성 된 모든 스레드는 기본적으로 비 데몬입니다. Thread는 자신을 생성하는 스레드 (예 : 상위 스레드)에서 데몬 특성을 상속하기 때문에 기본 스레드가 비 데몬 스레드이므로이 스레드에서 생성 된 다른 스레드는 setDaemon (true)을 호출하여 명시 적으로 데몬을 만들 때까지 데몬이 아닌 상태로 유지합니다.

  2. Thread.setDaemon (true)은 Thread 데몬을 만들지 만 Java에서 Thread를 시작하기 전에 만 호출 할 수 있습니다. 해당 Thread가 이미 시작되어 실행중인 경우 IllegalThreadStateException이 발생합니다.

Java에서 Daemon과 Non Daemon 스레드의 차이점 :

1) JVM은 데몬 스레드가 존재하기 전에 완료되기를 기다리지 않습니다.

2) 데몬 스레드는 JVM이 종료되고 최종적으로 블록이 호출되지 않고 스택이 풀리지 않고 JVM이 종료 될 때 사용자 스레드와 다르게 처리됩니다.


Java에서 Daemon Threads 는 JVM (Java Virtual Machine)이 종료되는 것을 막지 않는 스레드 유형 중 하나입니다. 데몬 스레드의 주된 목적은 특히 정기적 인 작업이나 작업의 경우 백그라운드 작업을 실행하는 것입니다. JVM이 종료되면 데몬 스레드도 종료됩니다.

를 설정하면 thread.setDaemon(true)스레드가 데몬 스레드가됩니다. 그러나 스레드가 시작되기 전에 만이 값을 설정할 수 있습니다.


다음은 사용자 스레드가 없어 jvm이 종료 된 경우 데몬 스레드의 동작을 테스트하는 예제입니다.

아래 출력의 두 번째 마지막 줄은 주 스레드가 종료되었을 때 데몬 스레드도 죽고 finally 블록 내에서 finally runs9 문을 인쇄하지 않았습니다 . 즉, 데몬 스레드의 finally 블록 내에서 닫힌 I / o 리소스는 사용자 스레드가 없어서 JVM이 종료되는 경우 닫히지 않습니다.

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

데몬 스레드는 모두가 설명했듯이 JVM을 종료하도록 제한하지 않으므로 기본적으로 종료 관점에서 응용 프로그램에 대한 행복한 스레드입니다.

Want to add that daemon threads can be used when say I'm providing an API like pushing data to a 3rd party server / or JMS, I might need to aggregate data at the client JVM level and then send to JMS in a separate thread. I can make this thread as daemon thread, if this is not a mandatory data to be pushed to server. This kind of data is like log push / aggregation.

Regards, Manish


Daemon thread is like daemon process which is responsible for managing resources,a daemon thread is created by the Java VM to serve the user threads. example updating system for unix,unix is daemon process. child of daemon thread is always daemon thread,so by default daemon is false.you can check thread as daemon or user by using "isDaemon()" method. so daemon thread or daemon process are basically responsible for managing resources. for example when you starting jvm there is garbage collector running that is daemon thread whose priority is 1 that is lowest,which is managing memory. jvm is alive as long as user thread is alive,u can not kill daemon thread.jvm is responsible to kill daemon threads.


Daemon threads are generally known as "Service Provider" thread. These threads should not be used to execute program code but system code. These threads run parallel to your code but JVM can kill them anytime. When JVM finds no user threads, it stops it and all daemon threads terminate instantly. We can set non-daemon thread to daemon using :

setDaemon(true)

Daemon threads are threads that run in the background as long as other non-daemon threads of the process are still running. Thus, when all of the non-daemon threads complete, the daemon threads are terminated. An example for the non-daemon thread is the thread running the Main. A thread is made daemon by calling the setDaemon() method before the thread is started

For More Reference : Daemon thread in Java


For me, daemon thread it's like house keeper for user threads. If all user threads finished , the daemon thread has no job and killed by JVM. I explained it in the YouTube video.


Let's talk only in code with working examples. I like russ's answer above but to remove any doubt I had, I enhanced it a little bit. I ran it twice, once with the worker thread set to deamon true (deamon thread) and another time set it to false (user thread). It confirms that the deamon thread ends when the main thread terminates.

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

JVM will accomplish the work when a last non-daemon thread execution is completed. By default, JVM will create a thread as nondaemon but we can make Thread as a daemon with help of method setDaemon(true). A good example of Daemon thread is GC thread which will complete his work as soon as all nondaemon threads are completed.


Daemon threads die when the creator thread exits.

Non-daemon threads (default) can even live longer than the main thread.

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

참고URL : https://stackoverflow.com/questions/2213340/what-is-a-daemon-thread-in-java

반응형