Java의 Thread.sleep은 언제 InterruptedException을 발생합니까? 무시해도 안전합니까? 멀티 스레딩을하지 않습니다. 일부 작업을 다시 시도하기 전에 몇 초 동안 기다립니다.
InterruptedException
당신은 당신이 처리하지 않으면 컴파일 또는 조인하거나 자고있는 방법에 예외의 유형을 선언 할 수 있도록 잡은 예외는있다 Thread
, 또는 전화 wait()
에 Object
.
Java의 Thread.sleep은 언제 InterruptedException을 발생합니까? 무시해도 안전합니까? 멀티 스레딩을하지 않습니다. 일부 작업을 다시 시도하기 전에 몇 초 동안 기다립니다.
InterruptedException
당신은 당신이 처리하지 않으면 컴파일 또는 조인하거나 자고있는 방법에 예외의 유형을 선언 할 수 있도록 잡은 예외는있다 Thread
, 또는 전화 wait()
에 Object
.
답변:
일반적으로 예외를 무시해서는 안됩니다. 다음 문서를 살펴보십시오.
인터럽트를 삼키지 마십시오
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 블록에 대한 설명. 그것은 기본적으로 결코 일어나지 않아야 함을 의미합니다. 따라서 코드가 발생할 수있는 환경에서 재사용되면 이에 대해 불평 할 것입니다.
RuntimeException
좋습니다.
Java Specialists 뉴스 레터 (내가 추천 할 수있는)에 대한 흥미로운 기사 와 InterruptedException
. 읽고 소화 할 가치가 있습니다.
는 InterruptedException
수면이 중단 될 때 일반적으로 발생합니다.