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

선종우님의 프로필 이미지
선종우

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

생명 주기와 상태 & ThreadPoolExecutor 아키텍처 이해

쓰레드풀에서 쓰레드를 재사용할 수 있는 이유가 궁금합니다.

작성

·

248

·

수정됨

0

  • 강의 초반부 스레드는 start해서 작업이 끝나면 재사용할 수 없다고 하셨고 자바독에서도 아래와 같이 start()가 재사용되는 것은 legal하지 않다고 표현하고 있습니다

    • It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.

  • 그런데 스레드풀 재사용 시에는 뭔가 다른 작업이 있을까 해서 강의와 함깨 디버깅해보니 addWorker()에서도 Worker에 할당된 스레드의 start()메소드로 호출하고 있었습니다. 스레드 풀의 경우 start()호출 후 메소드가 종료되었음에도 스레드를 재사용할 수 있는 이유는 무엇인가요?

 

  • 질문을 작성하고 나서 조금 더 고민해보니 아래와 같은 결론에 도달했습니다.(혹시 틀린 내용이 있다면 수정 의견 부탁드립니다) 비슷한 고민을 하신 분이 있을 것 같아 글을 남겨둡니다.

    • 생성된 스레드의 start() 실행 -> Worker의 run()실행 -> Worker의 runWorker()실행 -> while()조건에 의해 무한 루프

    • 무한루프가 되는 이유 : getTask()를 통해 큐에서 작업을 꺼내와 실행하고 큐에 작업이 없을 경우 블록킹되므로 블로킹이 해제된 시점에서는 task변수에 작업이 할당되어 while조건문이 true가 됨

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
선종우님, 스레드풀에서 쓰레드를 재사용할 수 있는 이유에 대해 궁금해하셨군요.

쓰레드를 시작하고 나서 해당 쓰레드가 완료된 후에는 start() 메소드를 통해 다시 시작할 수 없습니다. 이는 자바의 기본적인 쓰레드 사용 법칙이죠. 그러나 쓰레드풀에서는 쓰레드를 새로 생성하여 시작하는 대신에, 이미 시작된 쓰레드가 작업을 마쳤을 때 다른 새로운 작업을 할당받아 처리하는 방식으로 재사용합니다.

선종우님께서 말씀하신 대로, Workerrun 메소드 내부에서 runWorker 메소드를 실행하는 과정에서 실질적인 작업이 이루어지고, getTask()를 통해 계속해서 새로운 작업을 큐에서 꺼내어 실행하게 되는 구조입니다. 쓰레드가 실제로 완료되지 않고 큐에서 새로운 작업을 대기하는 형태로 인해 반복적으로 작업을 수행할 수 있는 것입니다.

만약 getTask()에서 할당할 작업이 없다면 쓰레드는 블록 상태로 전환되어 대기하게 되고, 새로운 작업이 큐에 등록되면 다시 활성화되어 작업을 수행합니다. 이렇게 작업 큐와 블록/대기 메커니즘을 통해 쓰레드풀은 쓰레드를 효율적으로 관리하고 재사용하는 것입니다.

선종우님의 결론이 쓰레드풀의 동작 방식에 대해 정확히 이해하고 계신 것으로 보입니다. 좋은 질문과 자세한 고민 공유해 주셔서 감사합니다. 추가로 궁금하신 점이 있다면 언제든지 질문해 주세요!

선종우님의 프로필 이미지
선종우

작성한 질문수

질문하기