2011-05-06 2 views
0

나는스레드가 절전 모드로 일시 정지 된 후에는 어떻게됩니까?

try{ 
    sleep(500); 
}catch(InterruptedException e){} 

interrupt 방법은 그 스레드에서 호출 될 때 스레드가 수면을 완료 또는 때 던져 InterruptedException되는 코드 다음습니까?

+0

이것은 분명히 스레드의 javadoc에 설명되어 있습니다. 알아 내서 읽어 보시지 그래요? http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html –

+1

을 보면 거의 예외를 잡아 버리고 그냥 버려야합니다. 그러나 이것은 단지 예일 뿐인 용서입니다. – rurouni

+0

예외는 예외적 인 상황에 대한 것이어야합니다. 정기적으로 발생해서는 안됩니다. –

답변

5

아니요, InterruptedException은 정상 흐름 중에 throw되지 않지만 interrupt()이 스레드에서 호출 된 경우 (예 :이 스레드의 정상적인 실행 흐름을 방해하려는 일부 다른 코드에 의해) 발생할 수 있습니다. 일반적으로 sleep은 sleep 문 다음의 줄에서 계속 실행됩니다.

3

interrupt 메서드가 절전 시간 동안 호출되면. catch은 코드가 try 인 경우에만 적용됩니다.

2

InterruptedException은, 수면 중에 발생했을 가능성이있는, 또는 그 전에 일어난 일이있어, 중단되고있는 경우에 throw됩니다. 대부분의 경우에는 예외 : InterruptedException을 기대하지 않습니다 그래서 인터럽트가 손실되지 않습니다 그것은 그것 IST 더 나은

try{ 
    sleep(500); 
}catch(InterruptedException e){ 
    Thread.currentThread().interrupt(); 
} 

에 처리하지 않으려는 경우.

+0

이 경우를 처리하는 좋은 방법은 아닙니다. 스레드가 인터럽트되면 스레드가 중지되어야 함을 나타냅니다. InterruptedException은 스레드가 대기 중일 때만 발생합니다 (절전 모드, IO 작업 차단 중 ...). 스레드가 처리중인 경우 예외가 발생하지 않으며 정기적으로 인터럽트 된 상태를 확인하여 처리를 중지하고 스레드가 종료되도록해야합니다. 귀하의 경우 귀하의 인터럽트 코드는 전혀 쓸모가 없습니다. –

+0

@Nicolas : InterruptedException을 처리 할 준비가되어 있지만 맞다.하지만 Object.wait (int)에서 InterruptedException을 가져 오는 도우미 메서드에 있다면 스레드를 종료 할 기회가 없다. 메소드가 InterruptedException을 던지거나 인터럽트 상태를 유지하므로 호출 코드가 처리 할 수 ​​있습니다. – rurouni

+0

예외가 전파되도록하는 것이 낫지 않거나 검사되지 않은 예외를 처리하기 위해 검사 예외를 처리하지 않으려는 경우에 좋지 않습니까? –

관련 문제