해결된 질문
작성
·
382
·
수정됨
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 상태를 의미하므로 당연히 태스크가 종료됨을 가정하는 것이 맞습니다