2012-01-16 4 views
-2

서블릿을 작성 중입니다. 서블릿은 init()에 스레드를 시작하고 서버가 중지 된 후에 올바르게 중지해야합니다. 스레드는 웹 페이지를 다운로드하고, 구문 분석하고, MySQL 데이터베이스에 데이터를 저장합니다.시스템에서 내 스레드를 어떻게 찾을 수 있습니까?

스레드를 중지하기 위해 서블릿의 destroy() 메소드를 사용합니다. 이 방법에서 나는 실을 끝내기위한 조건을 설정했다. 이것이 올바른 방법인가요?

내 Windows 어딘가에 내 스레드의 흔적이 보이나요? Windows 작업 관리자에서 찾지 못했습니다.

답변

3

Windows 작업 관리자는 개별 스레드가 아닌 프로세스 만 표시합니다. 실제로 JVM 관리 스레드는 커널 스레드 (운영 체제에서 관리)와는 다른 범주 인 사용자 스레드 범주에 속합니다.

원하는대로하려면 Thread 개체에 대한 전역 참조를 유지해야합니다. 다른 방법으로 볼 수 있습니다. Thread.stop()과 같은 것을 사용하는 대신 플래그를 설정하여 플래그를 스핀하도록 설정하는 것이 좋습니다. 이런 식으로 뭔가 :

class ThreadTask implements Runnable { 
    private volatile boolean flag = false; 

    public void setFlag(boolean value) { 
     flag = value; 
    } 

    public void run() { 
     while(!flag) { 
      // execute code 
     } 
    } 
} 

그리고 setFlag(true)를 호출하여 중지합니다.

+0

+1이라고 부르기 만하면됩니다. 스레드 인터럽트는 (거의 예외없이) 블로킹 메소드에있을 때에도 쉽게 스레드를 종료 할 수 있기 때문에 'Thread.interrupt()'및 패밀리가 _ad hoc_ 휘발성 부울 플래그보다 더 나은 선택임을 유의하십시오. 또한'Executors'와'Future's와 같은 기존의 표준 동시성 유틸리티들과 잘 어울립니다. –

+0

나는 그렇게했지만, 휘발성과 기능 setFlag 없이는 잊어 버렸다. 서블릿 필드로 선언 된 플래그. – savva

+0

@savva : 작동합니까? – Tudor

2

아니요, 창에서 볼 수 없습니다. 스레드가 아닌 프로세스가 표시됩니다. 스레드는 jvm 프로세스 내부에 있습니다.

스레드는 visualvm (JDK/bin/jvisualvm에도 포함됨)에 있습니다. 그냥 당신의 바람둥이에 연결하고 스레드를 참조하십시오.

destroy() 방법이 좋습니다. 그러나 thread.interrupt()으로 전화하십시오.

더 나은 방법은 Java 5 executors framework입니다. 실행 프로그램을 작성한 후 Runnable을 제출하십시오. destroy()executor.shutdown()

+0

죄송합니다. 이 메서드에서 플래그 만 설정하면 destroy가 인터럽트를 호출하는 이유는 무엇입니까? – savva

+0

스레드가 영원히 실행되지 않아야하기 때문에. 사실, 바람둥이가 어쨌든 방해 할 것이지만 경고를받을 것입니다. – Bozho

관련 문제