[CS/운영체제] 멀티스레드와 동시성 - 39부

황제연·2025년 8월 10일
0

CS학습

목록 보기
162/193
post-thumbnail

graceful shutdown

어떤 서버기능을 업데이트하기 위해 서버를 재시작해야한다고 가정하면,
새로운 요청에 대해 막고, 이전 작업에 대해 모두 완료한 다음 서버를 재시작하는 것이 가장 이상적일 것입니다

이렇게 서비스를 안정적으로 문제없이 종료하는 방식을 우아한 종료, graceful shutdown이라고 합니다

ExecutorService 종료 메소드

ExecutorService에는 다양한 종료 메소드가 존재합니다

서비스 종료

void shutdown()은 새로운 작업을 받지 않고, 이미제출된 작업을 모두 완료한 후에 종료합니다
논 블로킹 메소드입니다

List<Runnable> shutdownNo()
실행중인 작업을 중단하고, 대기 중인 작업을 반환하며 즉시 종료합니다
또한 실행중인 작업을 중단하기 위해 인터럽트를 발생시킵니다
논 블로킹 메소드입니다

서비스 상태 확인

boolean isShutdown()
서비스가 종료되었는지를 확인합니다

boolean isTerminated()
shutdown(), shutdownNow() 호출 후, 모든 작업이 완료되었는지 확인합니다

작업 완료 대기

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
서비스 종료 시 모든 작업이 지정된 시간만큼만 완료될 때까지 대기합니다
블로킹 메소드입니다

close()

자바 19부터 지원하는 서비스 종료 메소드로 shutdown()과 같습니다
정확히는 shutdown()을 호출하고 작업이 완료되거나 인터럽트가 발생할 때까지 무한정 반복대기합니다
호출한 스레드에 인터럽트가 발생해도 shutdownNow()를 호출합니다

처리중인 작업이 없는 경우 shutdown() 동작과정

ExecutorService에 작업이 없고 스레드가 대기하고 있을 때,
shutdown()을 호출하면 ExecutorService는 새로운 요청을 거절합니다
거절하면 java.util.concurrent.RejectedExecutionException예외가 발생합니다
또한 스레드 풀의 자원을 정리합니다

처리중인 작업이 있는 경우 shutdown() 동작과정

shutdown()을 호출하고 ExecutorService는 새로운 요청을 거절합니다
스레드 풀의 스레드는 처리중인 작업을 완료하며,
스레드 풀의 스레드는 큐에 남아있는 작업도 모두 꺼내서 완료합니다

모든 작업을 완료하면 자원을 정리합니다
결과적으로 처리중이던 작업들과 큐에 대기중이던 작업들도 완료됩니다

처리중인 작업이 있는 경우 shutdownNow() 동작과정

shutdownNow()를 호출하고 ExecutorService가 새로운 요청을 거절합니다
큐를 비우면서, 큐에 있는 작업을 모두 꺼내서 컬렉션에 반환합니다
List<Runnable> rn = service.shutdownNoW()
작업중인 스레드에 인터럽트가 발생하면 작업중인 task는 인터럽트가 걸리고
큐에 대기중인 task는 수행되지 않아 작업을 오나료하면 자원을 정리합니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글