작성
·
91
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
여기서 catch 부분에 break가 왜 필요한건가요?
"q" 를 입력하면 printerThread 에 인터럽트를 걸고 while문의 !Thread.interrupted가 false가 되어서 while문을 탈출하는게 아닌가요?
아니면 !Thread.interrupted가 false가 되기 전에 먼저 예외를 잡아서 인터럽트가 true에서 false로 먼저 되어서 !Thread.interrupted가 true가 되는건가요?
답변 2
0
저도 궁금해서 찾아보다가 알게되어 다른분들께 도움되었으면 하는 마음에서 답변 남깁니다
결론부터 말하자면 InterruptedException이 발생하면 interrupted() 플래그는 초기화된다고 합니다
따라서 try 문을 돌고 있던 상태에서 printerThread.interrupt()를 호출한다면 InterruptedException이 catch 될 것이고 interrupted()의 상태는 true에서 false로 초기화될 것입니다.
그 결과 while문을 빠져나오지 못하고 계속해서 루프를 돌고 있는 것입니다.
그렇다면 왜 InterruptedException은 interrupted()의 상태를 초기화시키는 걸까요? InterruptedException은 발생하면서 해당 인터럽트를 소비했다고 간주하는 것입니다.
0
안녕하세요, 인프런 AI 인턴입니다, lauhairo님.
인터럽트(Interrupt)에 관한 질문이 있으셨군요. 현재 다른 유사한 질문에 대한 답변을 찾지 못했지만, 관련된 답변 내용을 설명드리겠습니다.
여기서 인터럽트가 발생했을 때 catch
블록에서 break
가 필요한 이유는, 인터럽트가 발생하면 InterruptedException
이 발생하기 때문에 이를 처리하고 while
루프를 벗어나기 위해 필요합니다.
while
루프 내부의 조건문 !Thread.interrupted()
는 현재 스레드가 인터럽트되었는지를 체크하는 역할을 합니다. 하지만, 스레드가 sleep
상태에 있을 때 인터럽트를 걸게 되면 InterruptedException
이 발생하게 됩니다. 이때 catch
블록으로 빠지면서 while
루프를 벗어나야 하므로 break
를 사용하게 됩니다.
즉, q
가 입력되었을 때 인터럽트가 걸리면, sleep
상태를 빠져나오는 과정에서 InterruptedException
이 발생하며, 이 예외를 잡아 catch
블록으로 이동하게 됩니다. 여기서 break
문이 없다면, while
루프는 InterruptedException
을 무시하고 다시 돌아가기 때문에 break
문이 필요합니다.
예시:
while (!Thread.interrupted()) {
try {
log("스레드 실행");
Thread.sleep(2000);
} catch (InterruptedException e) {
log("예외 발생");
break;
}
}
log("작업 끝");
이 코드에서 Thread.sleep
중에 인터럽트가 걸리면 InterruptedException
이 발생하고 catch
블록이 실행됩니다. 여기서 break
를 통해 루프를 빠져나오지 않으면 while
이 무한 루프가 되어 버립니다.
다른 유사한 예제와 해결 방법을 확인하고 싶으시면, 다음 URL들을 참조하세요:
1. Java Thread에서 인터럽트 처리 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.