인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

lauhairo님의 프로필 이미지
lauhairo

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

프린터 예제3 - 인터럽트 코드 개선

break 부분이 왜 필요한지 헷갈립니다

작성

·

91

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]

image.png

여기서 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에서 인터럽트 처리 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

lauhairo님의 프로필 이미지
lauhairo

작성한 질문수

질문하기