80

Java의 Thread.sleep은 언제 InterruptedException을 발생합니까? 그것을 무시해도 안전합니까? 나는 멀티 스레딩을하고 있지 않다. 난 그냥 몇 가지 작업을 다시 시도하기 전에 몇 초 기다리고 싶어.Java의 Thread.sleep은 언제 InterruptedException을 발생합니까?

+2

http://stackoverflow.com/questions/1024651/do-i-have-to-worry-about-interruptedexceptions-if-i-dont-interrupt-anything-myse –

+1

어떤 의미에서 "무시" . 'InterruptedException'은 잡힌 예외이므로,'Thread'를 조인하거나 휴면 상태로 만드는 메소드 나'Object'에서'wait()'을 호출하는 메소드에 대해 이런 유형의 예외를 처리하거나 선언하지 않으면 컴파일 할 수 없습니다. – 8bitjunkie

+1

이 문서는이 메커니즘을 이해하는 데 도움이 될 수 있습니다. [InterruptedException로 수행 할 작업을 무엇입니까?] (http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

답변

24

일반적으로 예외는 무시하지 않아야합니다. 다음 논문에서 살펴 보자 :

인터럽트

을 삼키지 마십시오 때때로의 Runnable에 의해 정의 된 작업이 인터럽트 메소드를 호출 할 때와 아닌 옵션이 예외 : InterruptedException을한다 던지. 이 경우 InterruptedException을 다시 게시 할 수는 없지만 사용자는 아무 것도하고 싶지 않습니다. 차단 메서드가 인터럽트를 감지하고 InterruptedException을 throw하면 은 인터럽트 된 상태를 지 웁니다. InterruptedException 을 catch했지만 다시 throw 할 수없는 경우 중단이 발생했음을 나타내는 증거를 유지해야하므로 호출 스택의 코드가 위로 올라가서 중단에 대해 알아보고 원하는 경우 응답 할 수 있습니다. 이 태스크 은 interrupt()를 호출하여 현재 스레드를 "다시 인터럽트"합니다 (Listing 3 참조). 최소한, InterruptedException을 catch하고이를 다시 전복하지 않으면 리턴하기 전에 현재 스레드를 다시 인터럽트하십시오.

public class TaskRunner implements Runnable { 
    private BlockingQueue<Task> queue; 

    public TaskRunner(BlockingQueue<Task> queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      while (true) { 
       Task task = queue.take(10, TimeUnit.SECONDS); 
       task.execute(); 
      } 
     } 
     catch (InterruptedException e) { 
      // Restore the interrupted status 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

여기에 전체 용지를 참조하십시오에서 :

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-

+0

페이지가 없습니다. 게시물을 업데이트 할 수 있습니까? – Laurence

+1

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs- –

4

단일 스레드 코드에서 처리 할 수있는 고체 쉬운 방법을 것 비 e를 잡아서 RuntimeException에서 다시 시도하여 모든 메소드에 대해이를 선언 할 필요가 없도록하십시오.

9

Java 전문가 뉴스 레터 (내가 권장할만한 것이 좋습니다)는 interesting article on this이며 InterruptedException을 처리하는 방법을가집니다. 읽고 읽고 소화 할 가치가 있습니다.

-4

InterruptedException은 일반적으로 절전 모드가 중단 될 때 발생합니다.

+11

중개 된 자체가 아니라 실행중인 스레드이기 때문에 잘못되었습니다. 인터럽트 된 스레드 상태입니다. 잠자기 방법이 종료됩니다. – ubuntudroid

23

InterruptedException이 throw되면 스레드가 해당 스레드를 인터럽트 (일반적으로 종료)하려고 함을 의미합니다. 이것은 thread interrupt() 메소드에 대한 호출에 의해 트리거됩니다. wait 메소드는이를 감지하고 InterruptedException을 throw하므로 catch 코드가 즉시 종료 요청을 처리 할 수 ​​있고 지정된 시간이 끝날 때까지 기다릴 필요가 없습니다.

단일 스레드 응용 프로그램 (및 일부 다중 스레드 응용 프로그램)에서이 응용 프로그램을 사용하면 해당 예외가 발생하지 않습니다. 빈 캐치 절을 사용하여이를 무시하면 나는 권하지 않습니다. InterruptedException을 throw하면 (자), thread의 인터럽트 상태가 클리어됩니다. 따라서 적절하게 처리되지 않으면 그 정보는 없어집니다. 그러므로 나는 달릴 것을 제안 할 것이다 :

} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
    // code for stopping current task so thread stops 
} 

그 상태를 다시 설정한다. 그 후에 실행을 마칩니다.이것은 결코 사용하기 힘든 올바른 행동이 될 것입니다. 더 좋을 수도 무엇

는 추가하는 것입니다 : catch 블록에

} catch (InterruptedException e) { 
    assert false; 
} 

문. 그것은 기본적으로 결코 일어나지 않아야한다는 것을 의미합니다. 따라서 코드가 발생할 수있는 환경에서 코드가 다시 사용되면 불만을 토로합니다.

+4

Java의 어설 션은 [기본적으로 꺼짐]입니다 (http://stackoverflow.com/a/2758645/1143274). 그래서'RuntimeException'을 던지면됩니다. –

0

Threadsleep()wait()과 같은 메소드는 InterruptedException을 던질 수 있습니다. 어떤 다른 thread이 대기 중이거나 잠자고있는 thread을 방해하려고 할 때 발생합니다.

관련 문제