작성
·
226
0
안녕하세여, 해당 강의 내 10:10초 ~ 11:07초 에 해당하는 부분 질문입니다.
질문의 요점은 쓰레드 내의 wait, sleep과 같은 interruptExeception이 발생할 수 있는 코드가 없을 때에 해당 쓰레드를 작동시키는 ExecutorService가 shutdownNow() 되었을 때의 이야기입니다.
해당 강의 부분에서는 awaitTermination(1, TimeUnit.SECOND)로 메인 쓰레드에서 1초의 시간을 주고 1초의 시간 안에 ExecutorService가 종료되지 않는다면, showdownNow() api를 호출하여 강제종료시키고 있습니다.
강의 내에서 하위 쓰레드에 sleep 메서드를 제거하고 이 동작을 수행되었을 때, 강제종료되어도 interrupt와 관련한 wait, sleep이 없기 때문에 작업이 계속 진행된다, 라고 말씀하셨지만 예제 내에서 출력을 확인해보니 timeout이 발생하는 1초의 시간 내에 5개의 쓰레드는 각자의 작업을 이미 끝내어(sleep이 없기때문에) 종료가 정상적으로 일어났고, 그로인해 "쓰레드 풀 강제 종료 수행" 이라는 문구가 출력되지 않았음을 볼 수 있습니다.
즉 강의에서 설명해준 것과 달리, 강제종료되었으나, 하위 쓰레드가 interrupt와 관련한 메서드가 없어 정상 실행된것이 아닌, timeout이 발생하기 전에 하위 쓰레드의 모든 동작이 실행되었다고 판단하고 있습니다. 해당 부분이 맞는지 문의드립니다.
질문과는 별개로, 상세한 설명과 좋은 도식도로 내용이 잘 이해되게 해주셔서 정말 감사드립니다.
답변 1
1
네 맞습니다
사실 sleep 같은 것이 없어서 너무 빨리 작업이 종료된것 뿐입니다
그러나 기억할 부분은 강제종료시 인터럽트가 걸리면 인터럽트에 반응하는 이벤트가 없으면 스레드가 즉시 종료할 이유가 없다는 사실입니다
이 부분은 스레드 풀에서 강제로 인터럽트를 날리는 것 까지만 실행하고 스레드를 강제로 종료하는 추가적인 액션은 존재하지 않습니다
꼭 sleep 이 아니더라도 Thread.isInterrupted() 와 같은 것으로 이벤트에 반응하도록 한다면 스레드의 강제종료가 가능할 것입니다
자바에서 스레드를 강제종료하는 방법은 플래그를 사용하거나 인터럽트를 거는 방법이 존재하는데 스레드풀에서는 인터럽트를 거는 방식을 택한 것 뿐입니다
다만 스레드 풀 자체를 종료하는 것은 스레드의 강제종료와 상관없이 내부 흐름에 따라 진행이 됩니다