break 부분이 왜 필요한지 헷갈립니다
271
1 asked
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
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가 되는건가요?
Answer 3
1
저도 궁금해서 찾아보다가 알게되어 다른분들께 도움되었으면 하는 마음에서 답변 남깁니다
결론부터 말하자면 InterruptedException이 발생하면 interrupted() 플래그는 초기화된다고 합니다
따라서 try 문을 돌고 있던 상태에서 printerThread.interrupt()를 호출한다면 InterruptedException이 catch 될 것이고 interrupted()의 상태는 true에서 false로 초기화될 것입니다.
그 결과 while문을 빠져나오지 못하고 계속해서 루프를 돌고 있는 것입니다.
그렇다면 왜 InterruptedException은 interrupted()의 상태를 초기화시키는 걸까요? InterruptedException은 발생하면서 해당 인터럽트를 소비했다고 간주하는 것입니다.
0
while (!Thread.interrupted()) {
if (jobQueue.isEmpty()) continue;
try {
String job = jobQueue.poll();
log("출력 시작: " + job + ", 대기 문서: " + jobQueue);
Thread.sleep(3000); // 출력 작업에 3초가 걸린다고 가정
log("출력 완료: " + job);
} catch (InterruptedException e) {
log("인터럽트 발생. message=" + e.getMessage());
// break가 없다면, interrupt status=false로 바뀐 상태에서,
// 다시 while condition으로 돌아가게 되는데, 그러면 while loop에 갇히게 된다.
// 예외 발생은 try 블록을 벗어나서 catch 블록으로 가게끔 하는 것이지,
// while loop을 벗어나게 해주는 것은 아니다.
break;
}
}
log("프린터 종료");
실행 결과 - 위 코드에서 break 주석처리 했다고 가정
16:40:45.356 [ main] 프린터할 문서를 입력하세요. 종료 (q):
a
16:40:47.101 [ main] 프린터할 문서를 입력하세요. 종료 (q):
16:40:47.110 [ printer] 출력 시작: a, 대기 문서: []
b
16:40:47.293 [ main] 프린터할 문서를 입력하세요. 종료 (q):
c
16:40:47.599 [ main] 프린터할 문서를 입력하세요. 종료 (q):
d
16:40:47.853 [ main] 프린터할 문서를 입력하세요. 종료 (q):
q # ---------------------- 작업 중지를 지시함.
16:40:48.136 [ printer] 인터럽트 발생. message=sleep interrupted
# 만약 catch block에 break가 없다면?
# 인터럽트는 발생하고, 이를 소비했는데 while loop을 빠져 나가지 못하는 문제가 발생!
16:40:48.137 [ printer] 출력 시작: b, 대기 문서: [c, d]
16:40:51.141 [ printer] 출력 완료: b
16:40:51.141 [ printer] 출력 시작: c, 대기 문서: [d]
16:40:54.142 [ printer] 출력 완료: c
16:40:54.143 [ printer] 출력 시작: d, 대기 문서: []
16:40:57.145 [ printer] 출력 완료: d
Process finished with exit code 130 (interrupted by signal 2:SIGINT)
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에서 인터럽트 처리 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??
0
83
1
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
0
70
2
2.스레드 생성과 실행 - 17P 그림 문의
0
70
2
자바 동시성 현업에서 사용예시가 궁금합니다
0
130
1
ReentrantLock 동작 원리에 대한 질문입니다.
0
79
1
synchronized 대신 join 을 사용하여 순서를 보장할 경우 해법이 아닌가요?
0
91
2
메모리 가시성 문제 질문
0
67
1
Future4-이유 질문
0
61
1
오타 제보
0
71
2
runnable 질문
0
92
2
자바가 아닌 다른 언어에서도
0
108
1
메모리 가시성 문제가 발생하는 이유
0
123
1
데몬스레드가 어떨 때 사용이 되는지 궁금합니다.
0
76
1
Future.cancel() 취소를 사용하는 예가 궁금합니다.
0
82
1
synchronized 와 인스턴스의 lock
0
88
2
synchronized 키워드만으로 메모리 가시성이 해결되는 이유가 궁급합니다.
0
60
1
[스레드 풀과 Executor 프레임워크1][문제와 풀이] `log("일부 작업이 실패했습니다.");` 실행되는 경우가 있을까요?
0
56
1
원자적 연산이 멀티스레드 상황에서 안전한 이유를 제대로 이해했는지 확인 부탁드립니다
0
65
2
자바 고급 1,2,3편 같이 진행해도 문제없나요
0
75
2
CPU 캐시 때문에도 잔액이 200원이 될 수 있나요?
0
102
2
synchronized 메서드와 join 관련 질문이 있습니다.
0
67
2
섹션 14. 115번 강의 내용 질문
0
80
2
교안에 있는 7페이지 데이터 영역
0
49
1
Executor 스레드 풀 관리 질문
0
104
2

