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

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

망고123님의 프로필 이미지

작성한 질문수

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

인터럽트 - 시작2

[12:42] 구두 설명과 pdf 설명이 다른 부분의 질문

작성

·

160

0

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


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

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

[질문 내용]
여기에 질문 내용을 남겨주세요.

[12:42]에서 "main 스레드는 TIMED_WATING 상태에서 RUNNABLE 상태로..." 설명과 함께 마우스 포인터로 가리키신 pdf 에서는 work 스레드 라고 표기되어 있습니다.

설명에 혼란이 있어서 제가 인터럽트 호출 부분을 다음과 같이 이해한 게 맞는지 확인 부탁드립니다..!

0. work 스레드 동작
main() 스레드 안에서 thread.start(); 호출(work 스레드 호출)한다.


1. main() 스레드 동작
Thread.sleep(4000)을 호출하여 TIMED_WAITING 상태로 들어간다. (4초 대기)

2. thread.interrupt() 호출
4초 뒤 main() 스레드가 깨어나고(RUNNABLE 상태), 바로 아래 코드인 thread.interrupt() 호출한다.
-> 이때 work 스레드는 Thread.sleep(3000)으로 인해 TIMED_WAITING 상태였는데, main() 스레드의 인터럽트 신호로 인해 InterruptException이 발생하여 RUNNABLE 상태로 즉시 변경된다.

3. InterruptException 처리
work 스레드는 catch 블록에서 InterruptException 예외 처리 수행한다.

인터럽트 호출했다고 InterruptException 예외가 반드시 나는 것은 아니다. 설명에서 InterruptException 예외 발생한 이유는 main() 스레드에서 4초 대기 후 work() 스레드 인터럽트 호출할 때, work 스레드 상태가 TIMED_WAITING 였기 때문이다. work 스레드는 인터럽트 호출로 인해 TIMED_WAITING -> RUNNABLE 상태로 즉시 변경되고, work 스레드의 인터럽트 상태는 초기화 되어 false를 반환한 것이다.

이렇게 이해하면 될까요..?!

답변 2

1

한재현님의 프로필 이미지

강의자료 해당 부분 위의 설명에 "main 스레드가 4초 뒤에 work 스레드에 interrupt()를 건다." 라는 설명이 있으므로, TIMED_WAITING 상태에 있는 것은 work 스레드가 맞습니다.

또 사소하지만 2번에서 "이때 work 스레드는 Thread.sleep(3000)으로 인해 TIMED_WAITING 상태였는데"라고 말씀해주셨는데, while문의 조건을 확인하고 있거나 log를 찍고 있을 수도 있을 것 같습니다. 이후 거의 즉시 Thread.sleep(3000)을 호출하여 예외가 발생할 것이므로 크게 차이는 없겠지만요.

나머지는 모두 잘 이해하신 것 같습니다!

망고123님의 프로필 이미지
망고123
질문자

많이 늦어진 질문에도 답변 감사합니다 🙂 공부에 큰 힘이 됩니다 ㅎㅎ

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 망고123님.

스레드 상태와 인터럽트 동작에 대한 질문 주셨네요. 설명하신 내용에서 혼란을 겪으신 부분을 명확하게 해드리겠습니다.

  1. 스레드 상태 전환:

    • main 스레드는 thread.start();를 호출하여 work 스레드를 시작시킵니다.
    • main 스레드는 4초 동안 Thread.sleep(4000);을 호출하여 TIMED_WAITING 상태가 됩니다.
  2. 인터럽트 호출:

    • main 스레드가 4초 후에 깨어나면서 thread.interrupt();를 호출합니다.
    • 이 호출은 work 스레드가 sleep 상태(TIMED_WAITING)일 때 이루어지므로, InterruptedException 예외가 발생하게 됩니다.
  3. 전체적인 흐름 이해:

    • work 스레드는 TIMED_WAITING 상태에서 main 스레드의 인터럽트에 의해 InterruptedException이 발생하고 RUNNABLE 상태로 돌아옵니다.
    • 이 과정에서 work 스레드는 catch 블록으로 넘어가 예외를 처리하게 됩니다.

정리하자면:
인터럽트를 호출한다고 항상 예외가 발생하는 것은 아닙니다. 스레드가 TIMED_WAITING 또는 BLOCKED 상태일 때 인터럽트가 호출되면 InterruptedException이 발생하여 catch 블록으로 넘어갈 수 있는 것입니다. 설명하신 대로 이해하고 계신 것이 맞습니다.

유사한 주제를 다룬 질문 게시글을 아래 링크에서 확인해 보세요:
- Thread의 상태와 인터럽트에 대한 질문

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