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

JHS님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

Future2 - 분석

BlockingQueue에 Task 가 없어요

작성

·

205

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
ExecutorService.submit 시점에 디버깅을 걸어서 확인해보니 BlockingQueue 필드인 workQueue 내부에 task가 들어가지 않고 workers라는 HashSet에 들어가지는 것 같습니다

 

혹시 제가 어디서 놓친건지 모르겠어서 여쭤봅니다

 

이거 때문에 계속 헷갈려요..ㅜ

답변 2

1

안녕하세요, 인프런 AI 인턴입니다.
JHS님께서 질문하신 내용을 잘 읽어보았습니다. 우선적으로 ExecutorService와 BlockingQueue를 사용할 때의 동작에 대해 간단히 설명드리겠습니다.

ExecutorService는 Java에서 여러 스레드를 관리하고 작업을 할당하기 위해 사용됩니다. 이때 사용되는 BlockingQueue는 작업이 대기하는 저장 공간입니다. 그러나 일반적인 경우, submit한 작업(task)은 일시적으로 BlockingQueue에 들어가고, 바로 worker 스레드가 작업을 처리하기 위해 가져가므로, 디버깅 시점에 task가 보이지 않을 수 있습니다. 이는 정상적인 동작입니다.

workers라는 HashSet은 현재 작업 중인 스레드와 연관된 자료 구조이며, 각 작업이 처리되기 위해 스레드 풀의 worker에 할당되면 작업은 workQueue에서 사라집니다.

아래 링크에서 유사한 사례에 대한 답변을 찾아볼 수 있습니다:
- ExecutorService와 BlockingQueue의 동작 이해하기

해당 답변에서는 “작업이 Queue에 들어가지 않고 바로 처리되는 경우”라는 상황을 다루고 있으니 JHS님께 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

JHS님의 프로필 이미지
JHS
질문자

추가로 자답입니다

 

Callable을 많이 만들어서 submit을 진행해보니 queue에 쌓이는 것을 확인했습니다

 

poolSize보다 작으면 바로 thread를 만들어서 실행하고 넘어가야지 queue에 들어가는 걸로 확인했습니다

당연히 바로 queue에 들어갈 줄 알았는데 아닌것 같은데 맞나요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. JHS님

  1. 스레드풀과 Executor 프레임워크2 -> Executor 스레드 풀 관리 - 분석에서 해당 내용을 자세히 설명합니다 🙂

core 사이즈 만큼 없다면 스레드를 하나 생성하는데, 이때 작업을 큐에 넣을 필요가 없기 때문에 해당 스레드가 바로 작업을 처리하게 됩니다.

Executor 스레드 풀 관리 - 분석 부분을 복습해주세요 🙂

감사합니다.

JHS님의 프로필 이미지

작성한 질문수

질문하기