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

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

작성한 질문수

카프카 완벽 가이드 - 코어편

Wakeup을 이용하여 Consumer를 효과적으로 종료하기

addShutdownHook() 과 mainThread.join()

작성

·

446

0

안녕하세요! 설명을 너무 잘 해주셔서 유익하게 잘 듣고 있습니다 ㅎㅎ

Wakeup을 이용하여 Consumer를 효과적으로 종료하기 부분에서 질문이 있는데요,

프로그램이 종료되는 시점에 새로운 쓰레드를 만들어 실행하는 함수인 addShutdownHook() 안에 mainThread.join() 부분이 잘 이해되지 않습니다.

새로운 스레드가 ConsumerNetworkClient의 wakeup을 부르고 메인 스레드가 종료될 때까지 기다려야 해서 mainThread.join()을 부른다고 하셨는데, 메인 스레드의 종료 절차(메모리 정리 등?)를 마칠 때까지 기다린다는 의미가 맞을까요?

addShutdownHook() 함수가 프로그램이 종료될때 실행되는 함수인데 그 안에 종료를 기다리는 함수가 또 들어있어 헷갈렸습니다.

그리고 만약 mainThread.join()이 메인 스레드가 종료를 마칠 때까지 기다리는 게 맞다면, mainThead.join()을 먼저 부르고 kafkaConsumer.wakeup()을 이후에 호출해도 문제가 없는지도 궁금합니다~

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

자바에서 Thread는 주로 병렬 처리를 할 때 사용되는데,

메인 Application은 기본적으로 하나의 메인 프로세스, 그리고 이 메인 프로세스는 하나의 Thread로 기본 구성되어 시작됩니다.

메인 프로세스에서 또 다른 Thread를 생성할 수 있습니다. 그럼 두개의 Thread가 수행되는데, 이 두개의 Thread는 서로 다른 life cycle로 각각 수행됩니다(수행과 종료 시점이 서로 다릅니다)

메인 JVM 프로세스는 종료시(Ctrl+c), 별도의 정리 작업을 수행할 수 있게 도와주는 addShutdownHook()을 제공하는데 인자로 Thread를 입력 받고, 이 Thread에서 정리 작업을 수행합니다.

addShutdownHook(new Thread()....) 가 호출되면 새로운 Thread가 동작하면서 wakeup을 호출해서 Main Thread가 무한 loop poll()에서 빠져나온 뒤, close()를 호출하여 정상적으로 Consumer를 종료시키게 만들어 줍니다.

그런데 이 새로운 Thread는 Main Thread가 poll을 빠져 나와서 close()를 수행하고 종료 될 때까지 기다린 뒤 종료가 되어야 합니다. 그렇게 하지 않고 wakeup()만 호출하고 바로 종료가 되면 Main Thread가 poll()을 정상적으로 못 빠져나오거나 close()를 제대로 수행하지 못할 수 있습니다. 그래서 Main Thread가 poll()을 빠져나오고 close()를 수행한 뒤 정상적으로 종료 될 때가지 기다렸다고 종료되도록 Main Thread.join()을 수행하는 것입니다.

그리고 join()은 먼저 호출하지 않습니다. 작업을 수행하는 로직 다음에 join()을 호출해야 합니다.

정리드리자면

addShutdownHook() 함수가 프로그램이 종료될때 실행되는 함수이며, 별도의 정리작업을 인자로 받은 Thread를 통해 수행하게 합니다. 그리고 이 Thread는 Main Thread가 정상적으로 Consumer를 종료하는 작업을 마친 뒤에 함께 종료가 되어야 합니다.

감사합니다.

 

최진님의 프로필 이미지
최진
질문자

메인 스레드가 poll() 무한루프를 빠져나오고 close()로 컨슈머를 완전히 종료시킨 이후에 wakeup()을 호출하는 스레드가 끝나야 하는거군요! 답변 감사드립니다.

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

작성한 질문수

질문하기