2013-05-13 6 views
1

내 응용 프로그램에는 각 요청마다 자체 스레드가 있습니다. JMX/JConsole을 사용하여 모니터하고 경과 시간을 측정합니다. 요청에 너무 많은 시간이 필요할 경우 기본 스레드를 중단하여 중단하고 싶습니다. JConsole에서 호출하는 메서드에서 스레드 목록을 반복하고 적절한 인스턴스에서 interrupt()를 호출합니다.
단순히 스레드 인스턴스에서 interrupt() 메서드를 호출하면 플래그 만 설정되므로 InterruptedException도 throw해야합니다. 그러나이 중단 된 예외는 실제로 중단하려는 스레드 대신 currentThread에 적용됩니다. 플래그가 지정된 스레드를 종료하는 방법에 대한 힌트가 있습니까?다른 스레드에서 스레드를 종료하는 방법은 무엇입니까?

while (iterator.hasNext()) { 
        RequestHolder rh = iterator.next(); 
        if (rh.getThread().getId() == threadId) { 
         rh.getThread().interrupt(); 
         if(rh.getThread().isInterrupted()){ 

          throw new InterruptedException(); 
         } 
        } 
       } 

답변

2

그러나이 예외 : InterruptedException 대신 실제로 중지 할 스레드의 currentThread에 적용됩니다.

isInterrupted을 사용하여 모든 스레드의 중단 상태를 확인할 수 있습니다. 그러나 인터럽트가 언제 어떻게 소비되는지 알지 못하는 경우에는 블랙 박스 접근 방식으로 권장하지 않습니다.

어떤 힌트 방법 플래그가 지정된 스레드를 종료하려면?

당신은 다른 스레드에서하지 깨끗하게 종료 스레드를 할 수 있습니다.

하지만 매우 간단합니다. 실행중인 스레드에서 차단 기능에 대해서는 루프 캐치 InterruptedException과 같이 정기적으로 Interruption을 확인하십시오. 스레드에서 인터럽트를 볼 때 스레드가 중단되도록하십시오. 어떤면에서는 스레드가 자체 해지 정책을 구현합니다.

+0

은 단지 참고 사항 - 일부 차단하는 제 3 자 기능 때문에 IOException이 나처럼, 다른에 InterputException을 포장 할 수 있습니다 (축 그렇게). 그래서 항상 interupted 경우 확인하십시오. – JIV

1

InterruptedException을 발생시키는 데 이점이 없습니다. 귀하의 if (rh.getThread().isInterrupted()) 블록을 제거 할 수 있습니다.

각 스레드는 자신의 중단 상태를 모니터링해야하며, 그것이 중단 된 것을 볼 때 정상적으로 종료해야합니다.

try { 
    InputStream in = socket.getInputStream(); 
    while (in.read(buffer) >= 0) { 
     if (Thread.interrupted()) { 
      logger.log(Level.FINE, "Interrupted; exiting"); 
      break; 
     } 

     // Process request buffer here 
    } 
} catch (InterruptedIOException e) { 
    logger.log(Level.FINE, "Interrupted; exiting", e); 
} 

당신이 채널을 사용하는 경우, 당신은뿐만 아니라에서 ClosedByInterruptException를 잡으려고 할 것입니다 :

보통 코드는 다음과 같이 보인다.

0

당신은 스레드의 참조가 첫 번째의 종료를 수행 할 책임이 스레드의 생성자에서 종료 할 전달할 수 있습니다. 그런 다음 다른 스레드의 참조를 사용하여 스레드를 삭제할 수 있습니다.

관련 문제