Java에서 데몬 스레드란 무엇입니까?
자바에서 데몬 스레드가 뭔지 말해줄 사람?
데몬 스레드는 프로그램이 종료되었지만 스레드가 실행 중일 때 JVM이 종료되는 것을 막지 않는 스레드입니다.데몬 스레드의 예로는 가비지 컬렉션이 있습니다.
.setDaemon(boolean) Thread전 데몬 .
몇 가지 추가 사항(참조: Java Concurrency in Practice)
- 새 스레드가 생성되면 상위 스레드의 데몬 상태를 상속합니다.
데몬 이외의 모든 스레드가 완료되면 JVM이 중지되고 나머지 데몬 스레드는 폐기됩니다.
- 마지막으로 블록은 실행되지 않습니다.
- JVM을 이용하다
따라서 데몬 스레드는 적게 사용해야 하며 I/O를 수행할 수 있는 작업에 사용하는 것은 위험합니다.
위의 답변은 모두 좋습니다.차이를 설명하기 위해 간단한 코드 조각이 있습니다.도 참과 과 거짓으로 .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 non daemon thread),
// the WorkerThread continues to run.
// When true, (i.e. when it's a daemon thread),
// the WorkerThread terminates when the main
// thread or/and user defined thread(non daemon) 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개 사용하여 필요한 스레드의 파일 시스템 또는 네트워크에서 이미지를 가져옵니다.
데몬 스레드는 일반적으로 응용 프로그램/애플릿에 대한 서비스(예: "fiddley bits" 로드)를 수행하기 위해 사용됩니다.사용자 스레드와 데몬 스레드의 핵심 차이점은 JVM이 모든 사용자 스레드가 종료되었을 때만 프로그램을 종료한다는 것입니다.실행의 메인 스레드를 포함하여 실행 중인 사용자 스레드가 더 이상 없을 때 데몬 스레드는 JVM에 의해 종료됩니다.
setDaemon(true/false)?이 메서드는 스레드가 데몬 스레드임을 지정하기 위해 사용됩니다.
퍼블릭 부울 is Daemon()?이 메서드는 스레드가 데몬 스레드인지 여부를 판별하기 위해 사용됩니다.
예:
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>
데몬: d(isk) a(nd) e(xecution) mon(itor) 또는 de(vice) mon(itor)에서
데몬의 정의(컴퓨팅):
인쇄 스풀링이나 파일 전송 등의 서비스 요청을 처리하는 백그라운드 프로세스로, 필요하지 않은 경우 유휴 상태입니다.
Java에서 Daemon 스레드란 무엇입니까?
- 데몬 스레드는 흐름 사이에 언제든지 셧다운할 수 있습니다.즉, 사용자 스레드가 완전히 실행됩니다.
- 데몬 스레드는 데몬이 아닌 다른 스레드가 실행되는 동안 백그라운드에서 간헐적으로 실행되는 스레드입니다.
- 데몬 이외의 스레드가 모두 완료되면 데몬 스레드는 자동으로 종료됩니다.
- 데몬 스레드는 동일한 프로세스에서 실행되는 사용자 스레드의 서비스 공급자입니다.
- JVM은 실행 중 상태일 때 완료되는 데몬 스레드에는 신경을 쓰지 않습니다.결국 블록도 실행되지 않습니다.JVM은 당사가 작성한 데몬 이외의 스레드를 우선합니다.
- 데몬 스레드는 Windows에서 서비스 역할을 합니다.
- JVM은 (데몬 스레드와 달리) 모든 사용자 스레드가 종료되면 데몬 스레드를 중지합니다.따라서 데몬 스레드는 예를 들어 모든 사용자 스레드가 정지되는 즉시 JVM에 의해 스레드가 정지되는 모니터링 기능을 구현하기 위해 사용할 수 있습니다.
데몬 스레드는 응용 프로그램에 존재할 수 있는 요청 또는 다양한 시간 작업 처리와 같은 일부 작업을 백그라운드에서 수행하는 것으로 간주되는 스레드입니다.
프로그램에 데몬 스레드만 남아 있으면 프로그램이 종료됩니다.이는 보통 이러한 스레드가 일반 스레드와 함께 작동하며 이벤트의 백그라운드 처리를 제공하기 때문입니다.
할 수 .Thread를 사용하여 데몬을 만듭니다.setDaemon정지되면 정지합니다.애플리케이션이 정지하면, 정지합니다.
한 가지 오해는 분명히 하고 싶습니다.
- 사용자 스레드(A) 내에 데몬 스레드(B)가 작성되어 있는 경우, 이 사용자 스레드/부모 스레드(A)가 종료되어도 작성한 데몬 스레드/자녀 스레드(B)가 종료되지 않는다고 가정합니다.단, 현재 실행 중인 것은 사용자 스레드뿐입니다.
- 따라서 스레드 엔딩에는 부모-자녀 관계가 없습니다.생성된 위치에 관계없이 모든 데몬 스레드는 단일 라이브 사용자 스레드가 없으면 종료되며 이로 인해 JVM이 종료됩니다.
- 이마저도 (부모/자녀) 데몬 스레드 모두에 해당됩니다.
- 하위 스레드가 데몬 스레드에서 생성된 경우 이 스레드도 데몬 스레드입니다.이렇게 하면 명시적인 데몬 스레드 플래그 설정이 필요하지 않습니다.마찬가지로 사용자 스레드에서 작성된 하위 스레드도 사용자 스레드입니다.이 스레드를 변경하려면 해당 하위 스레드를 시작하기 전에 명시적인 데몬 플래그 설정이 필요합니다.
데몬 스레드 및 사용자 스레드.일반적으로 프로그래머에 의해 작성된 모든 스레드는 사용자 스레드입니다(데몬으로 지정하거나 부모 스레드가 데몬 스레드인 경우는 제외).사용자 스레드는 일반적으로 프로그램 코드를 실행하기 위한 것입니다.모든 사용자 스레드가 종료되지 않는 한 JVM은 종료되지 않습니다.
자바에는 데몬 스레드라고 불리는 특별한 종류의 스레드가 있습니다.
- 우선순위가 매우 낮다.
- 동일한 프로그램의 다른 스레드가 실행되고 있지 않을 때만 실행됩니다.
- JVM은 데몬 스레드가 프로그램에서 실행되는 유일한 스레드일 때 이러한 스레드를 종료하는 프로그램을 종료합니다.
데몬 스레드는 무엇에 사용됩니까?
보통 일반 스레드의 서비스 공급자로 사용됩니다.일반적으로 서비스 요청을 대기하거나 스레드의 작업을 수행하는 무한 루프가 있습니다.그들은 중요한 일을 할 수 없다.(CPU 시간이 언제인지 알 수 없고 실행 중인 다른 스레드가 없으면 언제든지 종료할 수 있기 때문입니다.)
이러한 종류의 스레드의 일반적인 예는 Java 가비지 컬렉터입니다.
더 있어...
- 는 '''에 안 해 주세요.
setDaemon()의 메서드start()데몬상태를 할 수 스레드가 실행되면 데몬 상태를 수정할 수 없습니다. isDaemon()스레드가 데몬 스레드인지 사용자 스레드인지 확인하는 메서드입니다.
데몬 스레드는 보조 도구와 같습니다.대몬 이외의 스레드는 프론트 퍼포먼스와 같습니다.어시스턴트는 수행자들이 작업을 완료할 수 있도록 도와줍니다.작업이 완료되면 공연자의 도움은 더 이상 필요하지 않습니다.도움은 필요 없기 때문에 조수들은 그곳을 떠난다.따라서 Daemon이 아닌 스레드의 작업이 끝나면 데몬 스레드가 사라집니다.
Java에서 데몬 스레드는 Java Virtual Machine(JVM; Java 가상 머신)의 종료를 막지 않는 스레드 유형 중 하나입니다.데몬 스레드의 주요 목적은 특히 정기적인 작업이나 작업이 정기적으로 수행되는 경우 백그라운드 작업을 실행하는 것입니다.JVM이 종료되면 데몬 스레드도 정지합니다.
「」를 .thread.setDaemon(true)스레드가 데몬 스레드가 됩니다.그러나 이 값은 스레드가 시작되기 전에만 설정할 수 있습니다.
다음은 사용자 스레드가 존재하지 않아 jvm이 종료된 경우 데몬 스레드의 동작을 테스트하는 예입니다.
다음 출력의 두 번째 마지막 줄에 주의해 주십시오.메인 스레드가 종료되었을 때 데몬 스레드도 정지되어 finally block 내에서 final executed9 스테이트먼트가 인쇄되지 않았습니다.즉, 사용자 스레드가 존재하지 않아 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이 셧다운된다는 점을 제외하면 일반 스레드와 동일합니다.일반적으로 데몬 스레드는 응용 프로그램에 대한 서비스를 수행하는 데 사용됩니다.
Java에서 데몬 스레드는 백그라운드에서 실행되며 가비지 컬렉션이나 기타 하우스키핑 태스크와 같은 백그라운드 태스크를 수행하기 위해 JVM에 의해 주로 생성되는 스레드입니다.
주의사항:
Java에서 메인 메서드를 실행하는 메인 스레드에 의해 작성된 스레드는 기본적으로 비데몬입니다.이는 스레드로부터 데몬 특성을 상속받으며, 메인 스레드는 비데몬 스레드이기 때문에 메인 스레드로부터 작성된 다른 스레드는 setDaemon(true)을 호출하여 데몬이 명시적으로 생성될 때까지 데몬이 아닌 상태로 유지됩니다.
Thread.setDaemon(true)은 스레드 데몬을 만들지만 Java에서 스레드를 시작하기 전에만 호출할 수 있습니다.Illigal(불법)을 던집니다.대응하는 스레드가 이미 시작되어 실행되고 있는 경우 ThreadStateException.
Java의 Daemon 스레드와 Non Daemon 스레드의 차이:
1) JVM은 데몬 스레드가 종료될 때까지 기다리지 않습니다.
2) 데몬 스레드는 JVM이 종료되고 최종적으로 블록이 호출되지 않으며 스택이 해제되지 않고 JVM이 종료될 때 사용자 스레드와 다르게 취급됩니다.
데몬 스레드는 모두가 설명한 바와 같이 JVM의 종료를 제한하지 않기 때문에 기본적으로는 종료 관점에서 어플리케이션에게 최적의 스레드입니다.
서드파티 서버/JMS에 데이터를 푸시하는 등의 API를 제공하는 경우 데몬 스레드를 사용할 수 있다는 점을 추가하고 싶습니다.클라이언트 JVM 수준에서 데이터를 집약하여 별도의 스레드로 JMS에 전송해야 할 수 있습니다.서버에 푸시해야 하는 필수 데이터가 아니라면 이 스레드를 데몬 스레드로 만들 수 있습니다.이러한 종류의 데이터는 로그 푸시/집약과 같습니다.
안부 전해 주세요,
데몬 스레드는 리소스 관리를 담당하는 데몬 프로세스와 같습니다.데몬 스레드는 Java VM에 의해 생성되어 사용자 스레드에 서비스를 제공합니다.예를 들어 unix의 시스템 업데이트는 데몬 프로세스입니다.데몬 스레드의 하위 항목은 항상 데몬 스레드이므로 기본적으로는 데몬이 false입니다.isDaemon() 메서드를 사용하여 데몬 또는 사용자로 스레드를 체크할 수 있습니다.따라서 데몬 스레드 또는 데몬 프로세스는 기본적으로 리소스 관리를 담당합니다.예를 들어 jvm을 시작할 때 우선 순위가 가장 낮은 1인 데몬 스레드인 가비지 컬렉터가 실행되고 있으며, 이는 메모리를 관리하고 있습니다. jvm은 사용자 스레드가 살아있는 한 활성 상태이며, u는 데몬 스레드를 죽일 수 없습니다.jvm은 데몬 스레드를 삭제합니다.
저에게 데몬 스레드는 사용자 스레드의 하우스키퍼와 같습니다.모든 사용자 스레드가 완료된 경우 데몬 스레드는 작업이 없으며 JVM에 의해 중지됩니다.유튜브 동영상으로 설명했습니다.
작업 예시를 가지고 암호로만 이야기합시다.나는 위의 Russ의 답변을 좋아하지만, 내가 가졌던 의심을 없애기 위해 그것을 조금 개선했다.worker 스레드를 deamon true(deamon 스레드)로 설정한 후 false(사용자 스레드)로 설정한 후 2회 실행했습니다.메인 스레드가 종료될 때 디아몬 스레드가 종료됨을 확인합니다.
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의 데몬 스레드
이미 많은 답변이 있습니다만, Daemon Threads에 대해 읽을 때처럼 조금 더 명확하게 알 수 있을지도 모릅니다.처음에는 잘 이해하고 있다고 느꼈습니다만, 그것을 가지고 놀고 나서 디버깅을 하고 나서, 이상한(나에게) 행동을 목격했습니다.
나는 다음과 같이 배웠다.
메인 스레드 오더 실행이 종료된 직후 스레드를 정지시키려면 Diamond로 설정해야 합니다.
내가 시도한 것:
- 2개의 스레드를 작성했습니다.
Main Thread그 중 1개밖에 설정하지 않았습니다.diamond; - 순서부여 완료 후
Main Thread새로 생성된 스레드 중 어느 것도 종료되지 않았습니다만, 저는 예상했습니다.Daemon스레드가 종료되어 있어야 합니다. - 저는 많은 블로그와 기사를 서핑을 했습니다.지금까지 제가 발견한 가장 훌륭하고 명확한 정의는 Java Concurrency In Practice라는 책에서 나온 것입니다.이 책은 다음과 같은 내용을 명확하게 기술하고 있습니다.
7.4.2 데몬 스레드
도우미 기능을 수행하는 스레드를 만들고 싶지만 JVM이 종료되는 것을 방지하기 위해 이 스레드가 존재하지 않는 경우가 있습니다.이것이 데몬 스레드의 용도입니다.스레드는 일반 스레드와 데몬 스레드의 두 가지 유형으로 나뉩니다.JVM이 시작되면 JVM이 생성하는 모든 스레드(가비지 컬렉터 및 기타 하우스키핑 스레드 등)는 메인 스레드를 제외한 데몬 스레드입니다.새 스레드가 생성되면 해당 스레드를 만든 스레드의 데몬 상태를 상속하므로 기본적으로 기본 스레드에 의해 작성된 모든 스레드도 일반 스레드입니다.일반 스레드와 데몬 스레드는 종료 시 발생하는 작업만 다릅니다.스레드가 종료되면 JVM은 실행 중인 스레드의 인벤토리를 수행하고 남은 스레드만 데몬 스레드일 경우 정상적인 셧다운을 시작합니다.JVM이 정지하면 나머지 데몬 스레드는 모두 폐기됩니다.마지막으로 블록은 실행되지 않고 스택은 언와인드되지 않습니다.JVM은 그냥 종료됩니다.데몬 스레드는 신중하게 사용해야 합니다.정리 없이 안전하게 폐기할 수 있는 처리 액티비티는 거의 없습니다.특히 모든 종류의 I/O를 수행할 수 있는 작업에 데몬 스레드를 사용하는 것은 위험합니다.데몬 스레드는 메모리 내 캐시에서 만료된 항목을 주기적으로 제거하는 백그라운드 스레드 등 "하우스키핑" 작업에 가장 적합합니다.
JVM은 데몬이 아닌 마지막 스레드 실행이 완료되면 작업을 수행합니다.하지만 메서드 「JVM」의 수 .setDaemon(true)GC를 사용하다GC 스레드는 모든 비데몬 스레드가 완료되는 즉시 작업을 완료합니다.
- 데몬 스레드는 사용자 스레드에 일반적인 서비스를 제공하는 스레드입니다(예: 서비스 정리 - 가비지 컬렉터).
- 데몬 스레드는 JVM에 의해 종료될 때까지 항상 실행됩니다.
- 데몬 스레드는 JVM이 종료될 때 사용자 스레드와 다르게 처리됩니다.마지막으로 블록은 JVM이라고 불리지 않고 종료됩니다.
- 모든 사용자 스레드가 종료되지 않는 한 JVM은 종료되지 않습니다.모든 사용자 스레드가 정지되면 JVM이 종료됩니다.
- JVM은 데몬 스레드가 완료되기를 기다리지 않고 기존 블록이 호출되지 않음
- 모든 사용자 스레드가 정지된 경우 JVM은 중지하기 전에 모든 데몬 스레드를 중지합니다.
- 모든 사용자 스레드가 종료되면 데몬 스레드도 종료할 수 있으며 메인 프로그램도 종료됩니다.
- 스레드의 start() 메서드를 호출하기 전에 setDaemon() 메서드를 호출해야 합니다.
- 스레드의 실행이 시작되면 데몬 상태를 변경할 수 없습니다.
- 스레드가 데몬 스레드인지 여부를 확인하려면 접근자 메서드 isDaemon()을 사용합니다.
Java 데몬 스레드
는 " " " 를 사용합니다.user thread ★★★★★★★★★★★★★★★★★」daemon tread★★★★★★ 。
JVM 플로우
1. If there are no `user treads` JVM starts terminating the program
2. JVM terminates all `daemon threads` automatically without waiting when they are done
3. JVM is shutdown
바와 같이요.daemon tread의 서비스 스레드입니다.user treads.
daemon tread우선순위가 낮은 스레드입니다.- 스레드는 상위 스레드에서 해당 속성을 상속합니다. , 「 설정 방법은, 「 해 주세요.
setDaemon()시작하기 전 방법 또는 확인 방법isDaemon()
언급URL : https://stackoverflow.com/questions/2213340/what-is-a-daemon-thread-in-java
'source' 카테고리의 다른 글
| C/C++ 매크로의 쉼표 (0) | 2022.08.10 |
|---|---|
| C의 단일 구조 부재 크기 (0) | 2022.08.10 |
| Java에서 문자열이 정수인지 확인 (0) | 2022.08.10 |
| vuex.disc 글로벌오류 핸들러 상태 (0) | 2022.08.10 |
| 상수 포인터 vs 상수 포인터 (0) | 2022.08.10 |