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

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

혜진님의 프로필 이미지
혜진

작성한 질문수

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

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

interrupt() 메서드 사용 부분

작성

·

28

0

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


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

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

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

아래 부분처럼 interrupt() 사용해서 수정했는데

잘 작동하는데 이건 잘못된 코드 일까요..?

while문도 try() catch() 문 안에 넣으면 안될까요 ..?

@Override
public void run() {
    try {
        while (true) {
            if (jobQueue.isEmpty()) {
                continue;
            }

            String job = jobQueue.poll();
            log("출력 시작: " + job + ", 대기 문서: " + jobQueue);
                Thread.sleep(3000);

            log("출력 완료: " + job);
        }
    } catch (InterruptedException e) {
        log("interrupt!");
        log("프린터 종료");
    }
}

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 혜진님

이렇게 변경하면 이제 인터럽트는 Thread.sleep()을 호출하는 시점에서만 유효하게 처리됩니다. 즉, sleep() 중이 아닐 때 인터럽트가 들어오면 해당 인터럽트는 sleep() 호출 시 반영되지 않고, Thread.currentThread().interrupt() 플래그만 세팅된 상태로 다음 sleep()에서 예외가 발생합니다. 만약 sleep()와 같은 인터럽트 가능한 메서드 호출이 없는 코드를 실행하고 있다면, while(true)는 여전히 계속됩니다.

감사합니다.

혜진님의 프로필 이미지
혜진

작성한 질문수

질문하기