[java] Java의 Thread.sleep은 언제 InterruptedException을 발생합니까?

Java의 Thread.sleep은 언제 InterruptedException을 발생합니까? 무시해도 안전합니까? 멀티 스레딩을하지 않습니다. 일부 작업을 다시 시도하기 전에 몇 초 동안 기다립니다.



답변

일반적으로 예외를 무시해서는 안됩니다. 다음 문서를 살펴보십시오.

인터럽트를 삼키지 마십시오

Runnable에 의해 정의 된 작업이 인터럽트 가능한 메서드를 호출하는 경우와 같이 InterruptedException을 던지는 것은 옵션이 아닙니다. 이 경우 InterruptedException을 다시 던질 수는 없지만 아무것도하지 않으려 고합니다. 차단 메서드가 중단을 감지하고 InterruptedException을 발생 시키면 중단 된 상태를 지 웁니다. InterruptedException을 잡았지만 다시 던질 수없는 경우 호출 스택의 상위 코드에서 중단을 인식하고 원하는 경우 응답 할 수 있도록 중단이 발생했다는 증거를 보존해야합니다. 이 작업은 목록 3에 표시된대로 interrupt ()를 호출하여 현재 스레드를 “재 인터럽트”하여 수행됩니다. 최소한 InterruptedException을 포착하고 다시 발생시키지 않을 때마다 리턴하기 전에 현재 스레드를 재 인터럽트하십시오.

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-


답변

InterruptedException이 던져진 다면 어떤 것이 그 스레드를 인터럽트 (보통 종료)하고 싶어한다는 것을 의미합니다. 이는 threads interrupt()메소드 에 대한 호출에 의해 트리거됩니다 . wait 메소드는이를 감지하고를 InterruptedException발생시켜 catch 코드가 종료 요청을 즉시 처리 할 수 ​​있고 지정된 시간이 끝날 때까지 기다릴 필요가 없습니다.

단일 스레드 앱 (및 일부 다중 스레드 앱)에서 사용하는 경우 해당 예외가 트리거되지 않습니다. 빈 catch 절을 사용하여 무시하는 것은 권장하지 않습니다. 를 던지면 InterruptedException스레드의 중단 된 상태가 지워 지므로 제대로 처리되지 않으면 해당 정보가 손실됩니다. 따라서 나는 실행을 제안합니다.

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

그 상태를 다시 설정합니다. 그 후 실행을 마칩니다. 이것은 결코 사용되지 않는 힘든 행동 일 것입니다.

더 나은 것은 이것을 추가하는 것입니다.

} catch (InterruptedException e) {
  throw new RuntimeException("Unexpected interrupt", e);
}

… catch 블록에 대한 설명. 그것은 기본적으로 결코 일어나지 않아야 함을 의미합니다. 따라서 코드가 발생할 수있는 환경에서 재사용되면 이에 대해 불평 할 것입니다.


답변

Java Specialists 뉴스 레터 (내가 추천 할 수있는)에 대한 흥미로운 기사InterruptedException. 읽고 소화 할 가치가 있습니다.


답변

sleep()wait()클래스 와 같은 메서드 ThreadInterruptedException. 이것은 다른 누군가 가 기다리고 있거나 잠자는 것을 thread방해하기를 원할 때 발생합니다 thread.


답변

단일 스레드 코드에서이를 처리하는 견고하고 쉬운 방법은 모든 메서드에 대해 선언 할 필요가 없도록이를 catch하고 RuntimeException에서 다시 작성하는 것입니다.


답변

InterruptedException수면이 중단 될 때 일반적으로 발생합니다.


답변