2011-04-20 2 views
1

다른 데몬이없는 스레드가없는 경우 모든 데몬 스레드가 종료되는 것으로 알고 있습니다. 정적 객체에서 데이터를 가져 오는 애플릿을 개발 중입니다. 이러한 정적 객체는 데몬 스레드에서 원격 서버의 일부 데이터를 다운로드하고 있습니다. 몇몇 애플릿은 동일한 데이터에 액세스 할 수 있으므로 모든 애플릿에 대해 스레드를 실행하는 것은 의미가 없습니다. 페이지를 새로 고침 할 때 문제가 발생합니다. 애플릿은 다시로드되고 정적 객체에 등록되며 JVM이 데몬 스레드를 종료한다는 것을 제외하면 모든 것이 잘됩니다.Java 애플릿 리로드에서 데몬 스레드를 죽입니다.

은 어쩌면 내가 단계별로 설명합니다

  1. 애플릿로드이며 데이터를 제공 정적 객체에 등록합니다.
  2. 정적 객체는 데몬 스레드를 시작합니다.
  3. 페이지 새로 고침.
  4. 애플릿이 언로드 됨 (stop() 및 destroy()가 호출 됨)
  5. 새 애플릿 인스턴스가 생성되고 정적 객체에 등록됩니다.
  6. JVM이 ThreadDeath를 데몬 스레드에 던지고 통신이 중지됩니다.

제 6 단계는 6 단계가 4 단계에서 5 단계 이전이어야합니다. 누락 된 부분이 있습니까?

내가 개발 한 해결 방법은 정적 객체에 등록하기 전에 잠자기 시간을내어 JVM에서 데몬을 종료시키고 데몬을 자동으로 생성하도록하는 것이지만 일시적인 해결책 일뿐입니다. 더 나은 해결책이 있습니까?

답변

0

stop() 또는 destroy()의 데몬 스레드를 종료하면 더 명확하게 이해할 수 있습니다.

+0

다른 애플릿 인스턴스 또는 서버에서 데이터를 기다리는 다른 객체가있을 수 있기 때문입니다. 문제는 JVM이 데몬을 죽이는 순간입니다. – BeginEnd

0

나는 애플릿간에 공유 배경 스레드를 장려 않을 것이다, 그러나 당신이 주장하는 경우에, 잘 당신은 다음과 같은 작업을 수행 할 수

당신은 그것을 놓치지 않도록 확실하게 Thread.setDefaultUncaughtExceptionHandler를 재정의 한 ThreadDeath 잡을 수 있습니다. 그런 다음 처리기에서 새 deamon 스레드를 다시 시작하여 제거 된 deamon 스레드를 대체 할 수 있습니다.

Thread.stop에 설명되어있는 것처럼 동기화 된 블록의 중간에 스레드를 중지 할 수 있기 때문에 백그라운드 스레드에서 공유 멤버에 synchronized를 사용하지 않아야합니다 (Java 플러그인은 Thread.stop을 사용합니다. 스레드를 죽인다.)

두 개 이상의 애플릿을 두 개의 다른 탭에서 연 경우 하나를 다시로드해도 JVM이 스레드를 죽이게하지 않습니다. 애플릿 환경에서 데몬 플래그가 작동하지 않는 것 같습니다.