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


110

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



1
어떤 의미에서 "무시"를 의미하는지에 따라 다릅니다. InterruptedException당신은 당신이 처리하지 않으면 컴파일 또는 조인하거나 자고있는 방법에 예외의 유형을 선언 할 수 있도록 잡은 예외는있다 Thread, 또는 전화 wait()Object.
8bitjunkie 2014

답변:


41

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

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

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-


38

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


5
Java의 어설 션은 기본적으로 꺼져 있습니다. 그래서 그냥 던지는 것이 RuntimeException좋습니다.
Evgeni Sergeev


5

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


3

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


-7

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


13
중단되는 것은 수면 자체가 아니라 스레드가 실행하는 것이기 때문에 잘못된 것입니다. Interrupted는 스레드 상태입니다. 수면 방법이 종료됩니다.
ubuntudroid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.