아무도 데몬 스레드가 Java에 무엇인지 말해 줄 수 있습니까 ?
아무도 데몬 스레드가 Java에 무엇인지 말해 줄 수 있습니까 ?
답변:
데몬 스레드는 프로그램이 완료되었지만 스레드가 여전히 실행 중일 때 JVM이 종료되지 않도록하는 스레드입니다. 데몬 스레드의 예는 가비지 수집입니다.
스레드를 시작하기 전에이 setDaemon(boolean)
메소드를 사용하여 Thread
디먼 특성 을 변경할 수 있습니다 .
setDamon(boolean)
경우 스레드가 시작되기 전에 만 호출 할 수 있습니다. 기본적으로 스레드는 상위 스레드의 디먼 상태를 상속합니다.
thread that does not prevent the JVM from exiting when the program finishes but the thread is still running
기본적으로 스레드를 시작한 JVM 프로세스가 데몬 스레드가 실행을 완료했는지 여부를 신경 쓰지 않고 모든 일반 스레드가 실행을 마치면 스스로 종료됩니다.
몇 가지 추가 사항 (참조 : Java Concurrency in Practice )
데몬 이외의 스레드가 모두 완료되면 JVM이 중지되고 나머지 데몬 스레드는 모두 폐기됩니다 .
이러한 이유로 데몬 스레드는 드물게 사용해야하며 모든 종류의 I / O를 수행 할 수있는 작업에는 데몬 스레드를 사용하는 것이 위험합니다.
finally
가 종료되고 블록이 실행되지 않습니다. 따라서 System.exit(…)
I / O를 수행하는 스레드가 실행 중이라고 생각되면 호출하지 마십시오 . 유일한 차이점은 데몬 스레드 만 남은 경우 JVM이 자체 종료를 트리거한다는 것입니다.
위의 모든 답변이 좋습니다. 차이점을 설명하기 위해 간단한 작은 코드 스 니펫이 있습니다. 의 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>
인쇄 스풀링 및 파일 전송과 같은 서비스 요청을 처리하고 필요하지 않은 경우 유휴 상태 인 백그라운드 프로세스입니다.
—— 출처 : Oxford Dictionary의 영어
데몬 스레드 응용 프로그램에서 존재할 수 처리 요청이나 다양한 chronjobs 같은 배경에서 일부 작업을하고있는 것으로 간주 스레드입니다.
프로그램에 데몬 스레드 만 남아 있으면 종료됩니다. 일반적으로 이러한 스레드는 일반 스레드와 함께 작동하고 이벤트의 백그라운드 처리를 제공하기 때문입니다.
메소드 를 사용하여 Thread
a를 데몬으로 지정할 수 있습니다. setDaemon
일반적으로 종료되지 않고 중단되지 않습니다. 응용 프로그램이 중지되면 중지됩니다.
내가 명확히하고 싶은 한 가지 오해 :
Java에는 데몬 스레드 라는 특수한 종류의 스레드가 있습니다.
데몬 스레드는 무엇에 사용됩니까?
일반적으로 일반 스레드의 서비스 제공자로 사용됩니다. 일반적으로 서비스 요청을 기다리거나 스레드 작업을 수행하는 무한 루프가 있습니다. 그들은 중요한 일을 할 수 없습니다. (CPU 시간이 언제인지 알 수 없으므로 다른 스레드가 실행 중이 지 않으면 언제든지 완료 할 수 있습니다.)
이러한 종류의 스레드의 전형적인 예는 Java 가비지 수집기입니다. 입니다.
더있다...
setDaemon()
하기 전에 메소드를 호출해야합니다.start()
방법을. 스레드가 실행되면 데몬 상태를 수정할 수 없습니다.isDaemon()
스레드가 디먼 스레드인지 사용자 스레드인지 확인 하려면 메소드를 사용하십시오 .Java의 데몬 스레드는 백그라운드에서 실행되며 가비지 수집 및 기타 하우스 키핑 작업과 같은 백그라운드 작업을 수행하기 위해 JVM에서 주로 생성되는 스레드입니다.
참고 사항 :
자바에서 메인 메소드를 실행하는 메인 스레드에 의해 생성 된 모든 스레드는 기본적으로 데몬이 아닌 스레드입니다. setDaemon (true)를 호출하여 명시 적으로 데몬을 만들 때까지 비 데몬 상태로 유지합니다.
Thread.setDaemon (true)는 스레드 디먼을 작성하지만 Java에서 스레드를 시작하기 전에 만 호출 할 수 있습니다. 해당 스레드가 이미 시작되어 실행중인 경우 IllegalThreadStateException이 발생합니다.
Java에서 데몬과 비 데몬 스레드의 차이점 :
1) JVM은 기존의 데몬 스레드가 완료되기를 기다리지 않습니다.
2) 데몬 스레드는 JVM이 종료 될 때 사용자 스레드와 다르게 처리되고 마지막으로 블록이 호출되지 않으며 스택이 풀리지 않고 JVM이 종료됩니다.
자바에서 데몬 스레드 는 JVM (Java Virtual Machine)이 종료되지 않도록하는 스레드 유형 중 하나입니다. 데몬 스레드의 주요 목적은 특히 정기적 인 작업이나 작업이있는 경우 백그라운드 작업을 실행하는 것입니다. JVM이 종료되면 데몬 스레드도 죽습니다.
를 설정하면 thread.setDaemon(true)
스레드가 데몬 스레드가됩니다. 그러나 스레드 시작 전에 만이 값을 설정할 수 있습니다.
다음은 사용자 스레드가 없기 때문에 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
데몬 스레드는 모두가 설명했듯이 JVM이 종료하도록 제한하지 않으므로 기본적으로 종료 관점에서 응용 프로그램에 대한 행복한 스레드입니다.
데이터를 타사 서버 또는 JMS로 푸시하는 것과 같은 API를 제공한다고 말할 때 데몬 스레드를 사용할 수 있기를 원합니다. 클라이언트 JVM 수준에서 데이터를 집계 한 다음 별도의 스레드로 JMS로 보내야 할 수도 있습니다. 서버에 푸시해야하는 필수 데이터가 아닌 경우이 스레드를 데몬 스레드로 만들 수 있습니다. 이러한 종류의 데이터는 로그 푸시 / 집계와 같습니다.
감사합니다, Manish
데몬 스레드는 리소스 관리를 담당하는 데몬 프로세스와 비슷하며 데몬 스레드는 Java VM에 의해 생성되어 사용자 스레드를 제공합니다. 유닉스, 유닉스 시스템 업데이트 예제는 데몬 프로세스입니다. 데몬 스레드의 자식은 항상 데몬 스레드이므로 기본 데몬은 false입니다. "isDaemon ()"메서드를 사용하여 스레드를 데몬 또는 사용자로 확인할 수 있습니다. 따라서 데몬 스레드 또는 데몬 프로세스는 기본적으로 리소스 관리를 담당합니다. 예를 들어 jvm을 시작할 때 메모리를 관리하는 우선 순위가 1 인 데몬 스레드 인 가비지 수집기가 실행 중입니다. jvm은 사용자 스레드가 살아있는 한 활성화되어 있으며 u는 데몬을 죽일 수 없습니다. thread.jvm은 데몬 스레드를 죽입니다.
실제 예제와 함께 코드로만 이야기합시다. 나는 위의 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
데몬 스레드는 일반적으로 "서비스 공급자"스레드라고합니다. 이 스레드는 프로그램 코드가 아니라 시스템 코드를 실행하는 데 사용되어야합니다. 이 스레드는 코드와 병렬로 실행되지만 JVM은 언제든지 스레드를 종료 할 수 있습니다. JVM이 사용자 스레드를 찾지 못하면이를 중지하고 모든 데몬 스레드가 즉시 종료됩니다. 다음을 사용하여 비 데몬 스레드를 데몬으로 설정할 수 있습니다.
setDaemon(true)
데몬 스레드는 프로세스의 다른 비 데몬 스레드가 여전히 실행중인 한 백그라운드에서 실행되는 스레드입니다. 따라서 데몬이 아닌 스레드가 모두 완료되면 데몬 스레드가 종료됩니다. 비 데몬 스레드의 예는 Main을 실행하는 스레드입니다. 스레드는setDaemon()
스레드가 시작되기 전에 메소드를
자세한 내용 은 Java의 데몬 스레드
나에게 데몬 스레드는 사용자 스레드의 하우스 키퍼와 같습니다. 모든 사용자 스레드가 완료되면 데몬 스레드에 작업이없고 JVM에 의해 종료 된 것입니다. YouTube 동영상 에서 설명했습니다 .
마지막 비 데몬 스레드 실행이 완료되면 JVM이 작업을 수행합니다. 기본적으로 JVM은 스레드를 비 데몬으로 만들지 만 method의 도움으로 스레드를 데몬으로 만들 수 있습니다 setDaemon(true)
. 데몬 스레드의 좋은 예는 모든 비 데몬 스레드가 완료되는 즉시 작업을 완료하는 GC 스레드입니다.
작성자 스레드가 종료되면 데몬 스레드가 종료됩니다.
비 데몬 스레드 (기본값)는 기본 스레드보다 오래 살 수 있습니다.
if ( threadShouldDieOnApplicationEnd ) {
thread.setDaemon ( true );
}
thread.start();
join
기본 스레드가 실행되는 동안 데몬은 유지됩니다.
Thread
javadoc에서는 그들이 무엇인지 설명 : java.sun.com/javase/6/docs/api/java/lang/Thread.html