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


809

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


20
Threadjavadoc에서는 그들이 무엇인지 설명 : java.sun.com/javase/6/docs/api/java/lang/Thread.html
skaffman


2
데몬 스레드의 경우 JVM이 중지 될 때 모든 데몬 스레드가 종료됩니다. 이러한 이유로 데몬 스레드는 정리가 실행되지 않을 수 있으므로 데몬 스레드를 자주 사용해서는 안됩니다. 예를 들어 모든 I / O는 정상적으로 종료하고 끝까지 쓰기 / 읽기를하지 않습니다.
msj121

답변:


631

데몬 스레드는 프로그램이 완료되었지만 스레드가 여전히 실행 중일 때 JVM이 종료되지 않도록하는 스레드입니다. 데몬 스레드의 예는 가비지 수집입니다.

스레드를 시작하기 전에이 setDaemon(boolean)메소드를 사용하여 Thread디먼 특성 을 변경할 수 있습니다 .


210
후손의 setDamon(boolean)경우 스레드가 시작되기 전에 만 호출 할 수 있습니다. 기본적으로 스레드는 상위 스레드의 디먼 상태를 상속합니다.
Gray

1
"프로그램이 완료 될 때 JVM이 종료되는 것을 막지는 않지만 스레드가 여전히 실행 중입니다."@sateesh는 "JVM이 나머지 데몬 스레드를 중단합니다"라고 말합니다. JVM이 종료되면 데몬 스레드가 실행을 완료합니까?
Gerald

23
@ Gerald, JVM이 종료되면 모든 스레드가 종료됩니다. B_erb는 "... 프로그램이 완료되면" 즉, 프로그램이 명시 적으로 JVM을 종료 하지 않으면 마지막 데몬 스레드가 종료 될 때 JVM이 자동으로 종료됩니다. 일반 스레드는 "프로그램이 종료 될 때"를 정의합니다. 데몬 스레드는 그렇지 않습니다.
Solomon Slow

2
따라서이 줄은 thread that does not prevent the JVM from exiting when the program finishes but the thread is still running기본적으로 스레드를 시작한 JVM 프로세스가 데몬 스레드가 실행을 완료했는지 여부를 신경 쓰지 않고 모든 일반 스레드가 실행을 마치면 스스로 종료됩니다.
Bhargav

1
@SolomonSlow JVM이 종료 될 때 여전히 작업을 수행하는 동안 데몬 스레드 (예 : 가비지 수집기)를 종료하면 어떤 결과가 발생합니까? 감사.
Venkat Ramakrishnan

340

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

  • 새 스레드가 작성되면 상위 스레드의 디먼 상태를 상속합니다.
  • 데몬 이외의 스레드가 모두 완료되면 JVM이 중지되고 나머지 데몬 스레드는 모두 폐기됩니다 .

    • 마지막으로 블록은 실행되지 않습니다 .
    • 스택이 풀리지 않습니다-JVM이 종료됩니다.

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


3
I / O에 데몬 스레드를 사용해서는 안되는 이유는 무엇입니까? BufferedWriters 등이 플러시되지 않는 것에 대한 우려입니까?
Paul Cager

4
@PaulCager 네, 쓰기 / 읽기 도중에 무릎을 cut 수도 있습니다.
Cruncher

52
두 번째 요점은 말도 안됩니다. JVM이 중지되면 스레드의 디먼 여부에 관계없이 모든 스레드 finally가 종료되고 블록이 실행되지 않습니다. 따라서 System.exit(…)I / O를 수행하는 스레드가 실행 중이라고 생각되면 호출하지 마십시오 . 유일한 차이점은 데몬 스레드 만 남은 경우 JVM이 자체 종료를 트리거한다는 것입니다.
Holger

11
"스택이 풀리지 않음"이란 무엇입니까?
ɢʜʘʂʈ ʀɛɔʘɴ

2
@ ɢʜʘʂʈʀɛɔʘɴ 거기 몇 가지 설명은 본 프로그램 포함 "긴장을 풀기 스택"에있다 flylib.com/books/en/2.254.1.277/1
user766353

175

위의 모든 답변이 좋습니다. 차이점을 설명하기 위해 간단한 작은 코드 스 니펫이 있습니다. 의 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
            }
        }
    }
}

2
@russ 좋은 코드 스 니펫! 그렇지만 WorkerThread 클래스를 정적으로 정의해야했습니다.
xli

@ xli 당신은 새로운 DaemonTest (). new WorkerThread (). start ()도 할 수 있습니다 :)
abhy

@russ 좋은 예입니다. "setDaemon (true)"를 명시 적으로 정의하지 않으면 기본 설정은 "setDeamon (false)"입니다.
huseyin

96

전통적으로 UNIX의 데몬 프로세스는 Windows의 서비스와 매우 유사하게 백그라운드에서 지속적으로 실행되는 프로세스였습니다.

Java의 데몬 스레드는 JVM이 종료되는 것을 방해하지 않는 스레드입니다. 특히 데몬 스레드 만 남아 있으면 JVM이 종료됩니다. 의 setDaemon()메소드를 호출하여 하나를 작성 합니다 Thread.

데몬 스레드를 읽습니다 .


3
이 시점에서 링크가 종료되었습니다. 아마도 업데이트 하시겠습니까? 어쨌든 당신을 위해 +1.
Jasonw

2
저는 UNIX와 Windows의 비교를 좋아합니다.
Premraj

여기에 최고의 설명!
LoveMeow

57

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

예를 들어, 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>

37

데몬의 정의 (컴퓨팅) :

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

—— 출처 : Oxford Dictionary의 영어

Java에서 데몬 스레드 란 무엇입니까?

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

System.exit ()를 호출하면 스레드가 데몬 스레드인지에 관계없이 finally 블록이 실행되지 않습니다. JVM이 아직 스레드를 종료하지 않은 경우 마지막 사용자 스레드가 종료 된 후에도 실제로는 데몬 스레드에서 블록이 실행됩니다.
benez

5
데몬 스레드는 시작하기 전에 변경되지 않은 경우 작성 스레드와 동일한 우선 순위로 실행됩니다. 데몬 스레드는 반드시 '서비스 제공 업체'또는 Windows 서비스 또는 여기에 언급 된 다른 것은 아닙니다. JVM을 종료하지 못하게하는 스레드 일뿐입니다. 기간.
user207421

35

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

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

메소드 를 사용하여 Threada를 데몬으로 지정할 수 있습니다. setDaemon일반적으로 종료되지 않고 중단되지 않습니다. 응용 프로그램이 중지되면 중지됩니다.


1
데몬 스레드이기 때문에 '데몬'의 의미입니다. 당신의 추론은 앞뒤입니다.
user207421

15

내가 명확히하고 싶은 한 가지 오해 :

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

이것은 아무것도 인용하지 않았습니다. 인용되지 않은 텍스트에는 인용 형식을 사용하지 마십시오. '인용'의 첫 번째 단락이 올바르지 않으며 두 번째 단락과 모순됩니다.
207421

@ EJP GOT IT, 그래서 모든 사람은 자신의 것이 아닌 다른 사람들에게 여기에 견적을 주어야합니다. 아니면 우리 자신이 어딘가에 인용했을까요?
Kanagavelu Sugumar

예, 경우 당신이 누군가를 인용 당신은 그들을 인용이 인용하지 않은 경우 단지 다른 곳처럼 비트는 사람이 당신이 가진 것처럼 포맷하지 않음 있습니다. 두 번째 문장의 머리 나 꼬리를 만들 수 없습니다.
user207421

12

데몬 스레드 및 사용자 스레드. 일반적으로 프로그래머가 작성한 모든 스레드는 사용자 스레드입니다 (데몬으로 지정하거나 상위 스레드가 디먼 스레드가 아닌 경우). 사용자 스레드는 일반적으로 프로그램 코드를 실행하기위한 것입니다. 모든 사용자 스레드가 종료되지 않으면 JVM이 종료되지 않습니다.


10

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

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

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

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

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

더있다...

  • 호출 setDaemon()하기 전에 메소드를 호출해야합니다.start() 방법을. 스레드가 실행되면 데몬 상태를 수정할 수 없습니다.
  • isDaemon()스레드가 디먼 스레드인지 사용자 스레드인지 확인 하려면 메소드를 사용하십시오 .

8
-1, 데몬 스레드가 본질적으로 우선 순위가 낮다고 생각하지 않습니다. 확실히 내가 본 문서는 없습니다. 또한이 SO 답변은 우선 순위와 데몬이 직교라고 주장합니다 : stackoverflow.com/a/10298353/839128
MikeFHay

5
데몬 스레드는 우선 순위와 아무 관련이 없습니다. 우선 순위가 높은 데몬 스레드 또는 우선 순위가 낮은 비 데몬 스레드를 가질 수 있습니다.
Gray

데몬 스레드는 처음에 작성 스레드와 우선 순위가 같습니다.
user207421

" '같은 프로그램의 다른 스레드가 실행되고 있지 않을 때만 실행됩니다"라는 문구가 잘못되었습니다.
프레드릭 가우스

9

데몬 스레드는 보조자와 같습니다. 비 데몬 스레드는 프론트 퍼포머와 같습니다. 어시스턴트는 수행자가 작업을 완료하도록 도와줍니다. 작업이 완료되면 더 이상 수행자가 도움을 필요로하지 않습니다. 도움이 필요하지 않으므로 조수가 자리를 비 웁니다. 따라서 데몬이 아닌 스레드의 작업이 끝나면 데몬 스레드가 행진합니다.


5

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


5

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

참고 사항 :

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

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

Java에서 데몬과 비 데몬 스레드의 차이점 :

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

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


5

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

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


다른 유형의 스레드는 무엇입니까? A : 없습니다. 데몬 스레드와 비 데몬 스레드가 있습니다. 이진, 두 상태입니다.
207421

5

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

아래 출력의 두 번째 마지막 줄은 주 스레드가 종료되면 데몬 스레드도 종료 되어 finally 블록 내에서 finally execute9 문을 인쇄하지 않았 음을 유의하십시오 . 이는 사용자 스레드가 없기 때문에 JVM이 종료되면 최종적으로 데몬 스레드 블록 내에서 닫힌 모든 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

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

데이터를 타사 서버 또는 JMS로 푸시하는 것과 같은 API를 제공한다고 말할 때 데몬 스레드를 사용할 수 있기를 원합니다. 클라이언트 JVM 수준에서 데이터를 집계 한 다음 별도의 스레드로 JMS로 보내야 할 수도 있습니다. 서버에 푸시해야하는 필수 데이터가 아닌 경우이 스레드를 데몬 스레드로 만들 수 있습니다. 이러한 종류의 데이터는 로그 푸시 / 집계와 같습니다.

감사합니다, Manish


다음은 java의 데몬 스레드를 보여주는 간단한 프로그램입니다. journaldev.com/1072/java-daemon-thread-example
Pankaj

4

데몬 스레드는 리소스 관리를 담당하는 데몬 프로세스와 비슷하며 데몬 스레드는 Java VM에 의해 생성되어 사용자 스레드를 제공합니다. 유닉스, 유닉스 시스템 업데이트 예제는 데몬 프로세스입니다. 데몬 스레드의 자식은 항상 데몬 스레드이므로 기본 데몬은 false입니다. "isDaemon ()"메서드를 사용하여 스레드를 데몬 또는 사용자로 확인할 수 있습니다. 따라서 데몬 스레드 또는 데몬 프로세스는 기본적으로 리소스 관리를 담당합니다. 예를 들어 jvm을 시작할 때 메모리를 관리하는 우선 순위가 1 인 데몬 스레드 인 가비지 수집기가 실행 중입니다. jvm은 사용자 스레드가 살아있는 한 활성화되어 있으며 u는 데몬을 죽일 수 없습니다. thread.jvm은 데몬 스레드를 죽입니다.


매우 혼란 스러우며
user207421

3

실제 예제와 함께 코드로만 이야기합시다. 나는 위의 russ 답변을 좋아하지만 의심을 없애기 위해 조금 강화했습니다. 워커 스레드를 deamon true (데몬 스레드)로 설정하고 다른 시간을 false (사용자 스레드)로 설정하여 두 번 실행했습니다. 메인 스레드가 종료되면 데몬 스레드가 종료됨을 확인합니다.

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은 '그들에게 모든 시간을 죽이는'수는 없지만, 그것은 것입니다 실행중인 비 데몬 스레드가 없을 때 그들을 죽일.
207421

@EJP 어쩌면 틀렸지 만 데몬이 아닌 스레드가 실행될 때 "죽일 것입니다." 스레드가 데몬 인 경우 완전히 실행되고 이제는 OS 수준에서 관리 될 때까지 jvm을 유지하면서 별도로 실행되지 않습니까?
89n3ur0n

데몬이 아닌 모든 스레드가 종료되면 피코 초가 아닌 종료됩니다. 확실히 '언제나'는 아닙니다.
user207421

3

데몬 스레드는 프로세스의 다른 비 데몬 스레드가 여전히 실행중인 한 백그라운드에서 실행되는 스레드입니다. 따라서 데몬이 아닌 스레드가 모두 완료되면 데몬 스레드가 종료됩니다. 비 데몬 스레드의 예는 Main을 실행하는 스레드입니다. 스레드는setDaemon() 스레드가 시작되기 전에 메소드를

자세한 내용 은 Java의 데몬 스레드


2

나에게 데몬 스레드는 사용자 스레드의 하우스 키퍼와 같습니다. 모든 사용자 스레드가 완료되면 데몬 스레드에 작업이없고 JVM에 의해 종료 된 것입니다. YouTube 동영상 에서 설명했습니다 .


2

마지막 비 데몬 스레드 실행이 완료되면 JVM이 작업을 수행합니다. 기본적으로 JVM은 스레드를 비 데몬으로 만들지 만 method의 도움으로 스레드를 데몬으로 만들 수 있습니다 setDaemon(true). 데몬 스레드의 좋은 예는 모든 비 데몬 스레드가 완료되는 즉시 작업을 완료하는 GC 스레드입니다.


어떻게 GC 스레드가 작동합니까? 프로그램의 메인 스레드가 너무 오래 걸리더라도 가비지 수집이 실행되지 않습니까 (메인 스레드가 종료되지 않음)?
Calicoder

내가 언급했듯이 GC 스레드는 마지막 NON 데몬 스레드가 끝날 때까지 작동하여 실행을 완료합니다. 프로그램의 메인 쓰레드는 데몬이 아닙니다. GC 쓰레드는 메인 쓰레드가 완료 / 킬되면 작업을 수행 할 것입니다. 기본적으로 프로세스가 완료되면 데몬 스레드가 종료되고 모든 비 데몬 스레드가 실행되면 프로세스가 완료된다고 말하고 싶습니다.
Arman Tumanyan

기본적으로 스레드의 데몬 상태는 상위에서 상속됩니다.
user207421

-1

작성자 스레드가 종료되면 데몬 스레드가 종료됩니다.

비 데몬 스레드 (기본값)는 기본 스레드보다 오래 살 수 있습니다.

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

이것은 잘못이다. 제작자 스레드가 아닙니다. 비 사용자 스레드가 실행중인 경우 데몬 스레드는 계속 실행됩니다. 데몬 스레드를 생성하는 포 그라운드 스레드를 작성하여 쉽게 테스트 할 수 있습니다. 포 그라운드 스레드가 수행 된 후에도 join기본 스레드가 실행되는 동안 데몬은 유지됩니다.
허버트 Grzeskowiak

데몬 스레드는 더 이상 실행할 수있는 비 데몬 스레드가 아닌 JVM으로 죽습니다. Javadoc을 참조하십시오. 답변이 완전히 틀 렸습니다.
user207421
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.