2012-01-03 5 views
3

데몬 스레드에 대해 혼란스러워합니다. 대부분의 사이트에서는 응용 프로그램이 중지되었을 때 종료되지만 응용 프로그램이 계속 실행중인 경우에는 종료되는 것으로 기록됩니다.Java의 데몬 스레드

+0

해당 스레드가 실행 중이고 웹 응용 프로그램에서 사용중인 경우 서버 효과를 중지합니까? – Rookie

답변

7

... 응용 프로그램이 계속 실행중인 경우에는 어떻게됩니까?

그러면 데몬 스레드가 계속 실행됩니다.

(이 문제의 스레드가 run() 방법에서 복귀하거나 잡히지 않은 예외의 결과로 죽지 않는 것으로 가정한다.) "디먼"로 스레드 마킹


포인트입니다 종료를 시작하기 전에 스레드가 완료 될 때까지 기다릴 필요가 없다는 것을 JVM에 알리기 위해. (종료하는 또 다른 방법은. 이것은 다른 비 데몬 스레드가있는 경우에도 종료를 시작 일부 스레드 호출 System.exit()을하는 것입니다.)


후속 내가하는 응용 프로그램이

그 계속해서 Tomcat 서버 아래에서 실행 중이며 내가 작성한 데몬 스레드가 응용 프로그램이 멈추지 않아 멈추지 않는다는 의견에서 유추했습니다.하지만 Tomcat 서버를 직접 중지하려고하면 메모리 누수가 발생합니까?

웹 응용 프로그램 (톰캣 서버 제외)을 중지하면 데몬 스레드가 계속 실행됩니다. 웹 애플리케이션에 의해 생성 된 쓰레드를 없애고 싶다면, 관련 컨텍스트 이벤트를 수신하고 쓰레드가 중단되도록 인터럽트 (또는 무엇이든)하도록 웹 애플리케이션을 프로그래밍해야합니다. Tomcat을 종료하는 경우

후 모든 데몬 스레드를 포함하여, 멀리 간다 :

  1. 성공적으로 (예 : "catalina.sh 정지") 다음 JVM이 종료되고 모든 스레드 (Tomcat 서버를 중지하면 데몬이나 그렇지 않으면) 죽는다.

  2. 실행 중 "catalina.sh stop"은 실패하지만 데몬 스레드 만 있으면 실패하지 않습니다.

    종료가 실패하면 종료 이벤트 처리에 방해가되는 웹 응용 프로그램이 있거나 중단되거나 응답하지 않는 상태에있는 Tomcat 서버 때문일 수 있습니다.Tomcat의 적어도 일부 버전에서는 데몬이 아닌 스레드가 있어도 종료가 실패하기에 충분합니다.

  3. "catalina.sh stop -force"를 실행하면 tomcat 인스턴스가 종료되면 5 초 안에 종료되지 않습니다. "catalina.sh help"또는 스크립트 소스를 참조하십시오.

tomcat을 종료했다가 다시 시작하면 스레드 누수와 메모리 누수가 발생합니다. 사실 이것은 누수에 대한 고전적인 해결 방법입니다.

+0

그 스레드가 실행 중이고 웹 응용 프로그램에서 사용하고 있다면 서버 효과를 멈출 수 있습니까? – Rookie

+2

@raghav - "서버 중지"의 의미에 따라 다릅니다. JVM이 종료하게되면 당연히 모든 데몬 스레드 (또는 데몬이 아닌 스레드)가 종료됩니다. –

+0

이 데몬 스레드가 연속적으로 실행되는 응용 프로그램에서 tomcat 서버 아래에서 실행 중인지를 의미합니다. 서버가 어떻게 처리합니까? 서버를 중지하려고하면 메모리 누수가 발생합니까? – Rookie

2

run 메소드가 리턴 될 때 또는 JVM에 더 이상 실행하지 않는 비 데몬 스레드가 없을 때 데몬 스레드가 중지됩니다. 영원히 실행되는 비 데몬 스레드가 있고 데몬 스레드의 run 메소드가 결코 반환되지 않으면 데몬 스레드도 영원히 실행됩니다.

+0

데몬이 아닌 스레드는 run 메소드가 종료 될 때 중지되지 않습니까? 내가 이해하는 한, 응용 프로그램이 종료되면 데몬 스레드가 종료됩니다. –

+1

오류, 예, 그게 내 대답에 있습니다. –

+0

void 반환 메서드는 코드 실행이 끝날 때 반환됩니다. 맞습니까? – Delfic

5

수정. 응용 프로그램은 모든 비 데몬 스레드가 완료 될 때만 종료됩니다. 이것은 데몬 쓰레드에는 적용되지 않습니다.

는 명확히하기 :

public static void main(String[] args) { 
    Thread thread = new Thread() { 
     @Override 
     public void run() { 
     while (true) { 
      // do something... 
     } 
     } 
    } 
    thread.setDaemon(true); 
    thread.start(); 
} 

위 즉시 종료됩니다. 그러나 thread.setDaemon (true)을 생략하면 프로그램이 종료되지 않습니다.

관련 문제