아래 코드를 작성하면 스레드를 인터럽트하거나 종료 할 수 없습니다. 또한 InterruptedException을 throw하지 않습니다.sleep() 및 wait() 같은 메서드를 차단할 때만 InterruptedException이 throw되는 이유는 무엇입니까?
Thread loop = new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
}
}
}
);
loop.start();
loop.interrupt();
이 스레드를 중단하려면, 나는 다음과 같이 내 코드를 수정해야합니다
Thread loop = new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.interrupted()) {
break;
}
// Continue to do nothing
}
}
}
);
loop.start();
loop.interrupt();
내 질문은,
- 자바는 이러한 방식으로 설계 예외 : InterruptedException 그 이유
sleep() 및 wait()와 같은 메서드를 차단할 경우에만 throw됩니다.
정상적인 코드에서 위의 코드 스 니펫과 같이 수동으로 처리해야하는 이유는 무엇입니까? 인터럽트 플래그를 true로 설정할 때마다 Java가 InterruptedException을 throw하지 않는 이유는 무엇입니까? interrupt() 메서드를 통해?
InterruptedException에 대한 많은 블로그와 기사를 읽었지만 설득력있는 대답을 찾지 못했습니다. 자바의 http://codepumpkin.com/interruptedexception-java-multithreading/
정상적인 실행 중에 코드가 인터럽트 될 수있는 경우 모든 코드 줄을 검사해야하며 속도가 매우 느립니다. 또한 일부 코드는 실행이 완료되어야합니다. 그렇지 않으면 예기치 않은 버그가 발생합니다 (예 : 리소스를 닫지 않는 등). – 4castle
그것은 기본적으로 deprecated stop() 메소드가 수행 한 것입니다. javadoc에서 더 이상 사용되지 않는 이유를 읽을 수 있습니다. 그러나 4 캐슬은 그것을 아주 잘 설명했다. –
자바 중단은 * 협력 적 *입니다. 하나의 스레드는 다른 스레드에게 수행중인 작업을 중단하도록 요청할 수 있지만 다른 스레드가 즉시 또는 심지어 계속해서이를 수행 할 필요는 없습니다. –