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

Inflearn Community Q&A

sugg's profile image

asked

Kim Young-han's Practical Java - Advanced, Part 1: Multithreading and Concurrency

데몬스레드 파트 첫 번째 예제

Written on

·

48

0

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


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

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

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

 

스크린샷 2025-04-14 225029.png.webp

정적 중첩 클래스에서 스레드를 정의한 후 main() 메서드에서 해당 스레드를 생성한 후 종료하는 예제입니다. 그런데 이 스레드의 run() 메서드를 보면 catch에서 런타임 오류를 생성한 후에 던집니다.

1. 발생한 오류는 체크 오류인데 굳이 런타임 오류를 새로 생성해서 던진 까닭은 단순히 InterruptedException 발생을 강조해서 알리기 위함인가요? (오류 로그를 남기듯이 오류 발생 흔적 남기기?)

2. run() 메서드에서 런타임 오류를 생성해서 던졌고 main() 메서드에는 이에 대한 별도의 오류 처리 과정이 없습니다. 그런데 왜 메인 메서드가 터지지 않고 정상 결과를 출력할 수 있는 건가요? 오류 처리 코드가 없으면 런타임 오류는 자동 던지기 처리돼서 메인 메서드 밖으로 오류 나가버리고 프로그램 다운돼야 하는 상황 아닌가요...?

 

java객체지향동시성multithreadthread

Answer 2

0

yh님의 프로필 이미지
yh
Instructor

안녕하세요. 자바재밌당님

우선 다음 링크에 남겨둔 것 처럼 예외 처리에 대한 복습이 필요합니다.

https://inf.run/X1QCt

그리고 이번 장에 있는 체크 예외 재정의 부분을 복습해주세요.

둘의 복습이 되셨다면 다음 설명을 참고해주세요 🙂

 

  1. 여기서 체크 오류를 잡아서 끝내도 괜찮습니다. 다만 Runnable의 구현체는 체크 예외를 던질 수 없습니다. 여기서는 간단한 예제이기 때문에 예외를 던지도록 했습니다. 이렇게 하면 예외가 발생했을 때 해당 예외의 추적 내용이 콘솔에 출력되기 때문에 간단하고 편리하게 오류 내용을 확인할 수 있습니다.

  2. 이후에 설명하지만 자바에서는 모든 스레드(데몬이 아닌)가 종료되어야 프로그램이 종료됩니다. 따라서 이 스레드 하나만 종료되어도 괜찮습니다.

감사합니다.

0

communityai8509님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

데몬 스레드와 관련된 코드 예제에 대한 질문을 주셨군요. 질문의 두 가지 핵심 포인트에 대해 아래와 같이 설명 드리겠습니다.

  1. InterruptedException을 RuntimeException으로 변환하는 이유

    • InterruptedException은 체크 예외로, 일반적으로 해당 예외가 발생하면 반드시 처리하거나 선언해야 합니다. 하지만 스레드 코드 내부에서 체크 예외를 RuntimeException으로 변환하여 던지는 경우는, 해당 스레드를 사용하는 코드가 그 예외를 명시적으로 처리할 필요가 없도록 하기 위함입니다. 이는 개발자가 특정 예외 상황을 강조하고, 런타임 시점에 예외를 처리하게 만들어 코드 간소화와 같은 이점을 얻기 위한 방법 중 하나입니다.
  2. RuntimeException이 던져져도 메인 메서드가 영향을 받지 않는 이유

    • 스레드는 독립적으로 실행됩니다. 각 스레드의 예외는 그 스레드 컨텍스트 내에서 처리되며, 해당 스레드의 실행이 종료될 수 있지만 메인 메서드가 영향을 받지는 않습니다. 즉, 메인 메서드는 자신이 생성한 스레드에서 발생한 런타임 예외에 직접적인 영향을 받지 않으며, 스레드가 비동기적으로 작동하므로 메인 메서드 외부에서 처리되지 않습니다.

또한, 이 게시물에서는 JUnit Test에서 비슷한 상황에 대한 설명을 제공하며 스레드와 메인 메서드 간의 관계를 이해하는 데 도움이 될 수 있습니다.

관련 게시물 참고:
- JUnit Test에서 Non-Daemon Thread 동작에 대한 설명: Why non-daemon thread is terminating if in junit test

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