2011-08-15 6 views
36

나는 Deamon 스레드가 배경 스레드임을 알고 있습니다. setDaemon(true)을 호출하여 자체 데몬 스레드를 만들 수 있습니다.데몬 스레드는 언제 유용합니까?

내 질문은 : 왜 우리는 데몬 스레드로 스레드를 만들어야합니까?

답변

43

실행중인 모든 스레드가 데몬 스레드 일 때 JVM이 종료됩니다. 그래서 당신이 끝내기로 결심 할 때까지 메인 메소드가 반복되는 간단한 게임을 작성한다고 상상해보십시오. 게임이 시작될 때 웹 사이트를 끊임없이 폴링하여 경고를 발생시키는 스레드를 시작한다고 상상해보십시오. 게임 종료를 결정할 때 JVM을 종료하고 싶습니다. 끝없는 폴링으로 게임이 끝나지 않도록하고 싶지 않습니다. 그래서이 폴링 쓰레드를 데몬 쓰레드로 만든다.

+0

예를 들어 사용자가 게임을 종료하기로 결정한 경우 사용자 스레드 (데몬 스레드가 아닌)가 아직 실행중인 경우 JVM이 차단하겠습니까? – Kal

+0

@Kal : 그렇습니다. 그것이 작동하는 방식입니다. 사용자 스레드는 JVM이 종료되지 않도록합니다. –

+1

예 : 기본 메소드가 단순히 리턴되면 JVM은 계속 실행됩니다. 물론 System.exit을 호출하면 실행이 중지됩니다. –

10

모든 "정상"스레드가 종료되면 Deamon 스레드는 JVM에 의해 자동 종료됩니다. 일반 스레드는 절대로 자동 종료되지 않습니다.

4

본질적으로 사용자 스레드를 통해 사용자 개입없이 소비자에게 제공하려는 서비스는 사용자 스레드를 데몬으로 설정하는 주요 사용 사례를 형성합니다.

결과적으로 사용자 스레드가 존재할 때까지 스레드가 지속적으로 실행되는 JVM 보장이 있습니다. GC, UI Thread 등의 예제를 찾을 수 있습니다. 이들은 데몬입니다.

희망이 있습니다.

1

일반적으로 모든 스레드가 자신의 run() 메소드를 종료하면 프로그램이 종료됩니다. 데몬 스레드는 프로그램이 아직 실행 중이어도 종료하지 못하게합니다 (예 : run()).

따라서 스레드가 계속 실행 중일 때 프로그램 종료를 막지 않으려면 데몬 스레드를 사용해야합니다. 예를 들어 장기간의 정기적 인 작업에서는 전형적이지만 실제로 프로그램, 디자인 및 취향에 크게 좌우됩니다.

2

다른 스레드가 지적한 것처럼 데몬 스레드는이 스레드가 실행 중일 때 프로그램이 종료 될 때 JVM이 종료되지 않도록합니다.

일반적으로 스레드에 부작용이 없다는 것을 확신하지 않는 한 일반적으로 데몬 스레드를 만들지는 않을 것입니다. 스레드가 멈출 때를 알 수 없으므로 파이널 라이저 블록이 실행되지 않으며 스택이 풀리지도 않습니다. 따라서 데이터를 손상시킬 수 있으므로 데몬 스레드에서 IO 작업을 사용하지 마십시오.

0

저는 타이머와 함께 사용하여 즉시 삭제할 수없는 파일을 삭제했습니다. 즉, .exe 파일을 생성하고 실행 한 다음 삭제합니다. 그러나 executable.delete이 실패 할 확률은 50 %입니다. 이미지가 종료 과정에서 여전히 차단되어 있기 때문입니다. 프로세스가 완전히 완료된 후에 만 ​​실행 가능 이미지를 안정적으로 삭제할 수 있습니다. 하지만, 얼마나 걸릴지 결코 알 수 없습니다. 그러므로 .delete 대신에 .deleteOnExit를 설정하십시오. 하지만 자바 머신이 종료 될 때까지 기다리지 않으려 고합니다. 매우 오래 걸릴 수 있으며 더 이상 필요없는 수백만 개의 쓸데없는 바보 같은 .exe 파일이 파일 시스템에 걸리기를 원하지 않습니다. 그러므로 1 초에서 2 초 후에 실행되도록 타이머에서 executable.delete를 예약합니다. 그러나 타이머는 일반적인 스레드가 될 수 없습니다. 그렇다면 삭제할 파일이 없더라도 프로그램이 종료되지 않습니다. 나는 쉽게 데몬을 만들 수있다. 왜냐하면 내 파일이 삭제되는지 또는 타이머에 의한 것이 아닌지가 중요하기 때문이다. 파일은 데몬이나 자바 종료에 의해 어느 쪽의 방법 으로든 제거 될 것이다. 나는 데몬을 완벽하게 사용한다고 생각합니다.

0

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

새 스레드가 생성되면 상위 스레드의 데몬 상태를 상속합니다. 일반 쓰레드와 데몬 쓰레드는 종료시 발생하는 상황이 다릅니다. JVM이 중단되면 남아있는 모든 데몬 스레드가 포기됩니다. 마지막 블록은 실행되지 않고 스택은 풀리지 않습니다. JVM이 종료됩니다. 이러한 이유 때문에 데몬 스레드는 조심스럽게 사용해야하며 모든 종류의 I/O를 수행 할 수있는 작업에이 스레드를 사용하는 것은 위험합니다.

+0

손상 될 수 있으므로 데몬 스레드에서 IO 작업을 사용하지 마십시오. 데이터. –

관련 문제