• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

[keepAliveTime - 스레드 유휴 시간 설정] - 설명에 대한 의문점

24.01.07 14:02 작성 24.01.07 14:16 수정 조회수 211

1

안녕하세요 선생님, 강의를 듣다가 의문점이 드는 설명이 있어서 질문 올립니다.

[keepAliveTime - 스레드 유휴 시간 설정] 강의
03:56 ~ 04:20 의 설명을 듣고 나서 처음에는 끄덕였는데,
강의를 다 듣고 나니까 뭔가 의문점이 생겼습니다.

해당 시간대에 설명에서는 Thread.sleep(3000) 메소드가 유휴상태를 일으키고, 이것 때문에 keepAliveTime 에 의해서 쓰레드가 제거된다고 설명해주십니다.

이때 듣고 나서 아래와 같은 생각을 하게 되더라구요.

"그러면 Thread.sleep(3000) 을 하고, KeepAliveTime 을 2초를 줘서 정말 저 3초가 지나기 전에 쓰레드가 삭제되야 된다면 쓰레드가 제거되기 전에 InterruptedException 같은 걸 던지려나?"

... 라는 생각을 하게 되더라구요.
그리고 제가 한 테스트 결과는 그렇지 않더군요...

이상해서 이리저리 찾아보니 다음과 같은 설명을 jdk
소스 파일에서 발견했습니다.

 

여기서 제가 주목한 구절은
"Timeout in nanoseconds for idle threads waiting for work." 입니다.

이 말은 Thread 가 sleep 같은 상태에서 멈추더라도,
해당 Thread 는 "다음 일을 받기 위해서 대기하는 쓰레드" 가 아니기 때문에 keepAliveTime 에 의해서 제거되는 타겟이 아니지 않나요?

더 정확히는...

keepAliveTime 의 유휴시간은
==> Thread.sleep(3000) 에서 유휴시간 Check X
==> 쓰레드가 자기의 task 를 모두 끝난 직후부터 유휴시간 Check O

... 인 게 맞지 않나요?

답변 1

답변을 작성해보세요.

1

네 맞습니다

정확한 것은 아무일도 하지 않는 대기하는 스레드 기준이 맞습니다

다만 강의에서 sleep 을 설명한 것은 대기개념을 표현하기 위해입니다

실제로는 모든 태스크가 완료되고 나서 아무일도 하지 않는 스레드를 기준으로 한 것이 맞고 이를 설명하는 과정에서 대기 스레드를 sleep 만큼 유휴시간을 가진다고 가정하고 메인스레드에서 각 스레드들의 결과를 보여주기 위함이라고 이해해 주시면 될 것 같습니다

유휴 시간 자체가 스레드의 idle 상태를 의미하므로 당연히 태스크가 종료됨을 가정하는 것이 맞습니다