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

아무도_모를_아이디님의 프로필 이미지
아무도_모를_아이디

작성한 질문수

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

corePoolSize & maximumPoolSize - 기본 스레드 & 최대 스레드

corePoolSize & maximumPoolSize 수강 중 질문입니다.

작성

·

163

·

수정됨

0

corePoolSize & maximumPoolSize - 기본 스레드 & 최대 스레드 22분 35초 정도 듣고 있는데 궁금한게 있습니다.

ArrayBlockingQueue에 4개의 태스크가 모두 차면

  1. 큐에 적재되지 못한 나머지 태스크는 어디서 대기 하나요?

  2. (핸들러가 없다는 가정하에) 그리고 max thread 까지 생성되면 큐에 적재되지 못한 나머지 태스크들을 max thread개수 만큼 처리하고 이후 찐으로 초과된 태스크는 처리하지 못해 Exception이 발생하나요?

 

뭔가 제가 이해를 잘 못하고 있는 것 같은데

corePoolSize와 Queue 의 사이즈를 왜 더해서 태스크 개수와 비교하는지 이해를 못하겠어요. 태스크가 큐에 모두 채워지면 나머지 태스크 중 전체 쓰레드 개수 까지는 큐에 적재되지 못해도 처리가 된다로 이해 하면 될까요?

아니면 원랜 큐가 다 차면 Exception이 발생하는데 해당 시간대의 예제에선 defaultHandler 가 뭔가 태스크가 모두 차도 쓰레드 개수만큼은 추가로 처리 할 수 있도록 뭔가 처리를 한 걸까요?

--> 뒤에 더 보니 worker에서 바로 처리 하는 군요;; 

 

추가로

큐에서 태스크가 처리되면 다시 공간이 생길 것 같은데 왜 모두 차는지 이해가 잘 안되요. (제가 뭔가 잘못 알고 있는 걸까요)

 

 

 

강의 너무 좋습니다. 이후 강의도 빨리 내주세요 ㅠ_ㅜ

 

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

아래 AI 인턴 답변이 정확한 의미라 볼 수 있습니다. 요약하면 다음과 같습니다.

  1. 태스크가 제출될 때, corePoolSize까지는 스레드가 생성되어 작업이 실행

  2. 만약 모든 코어 스레드가 작업중이면 추가 작업은 큐에 배치

  3. 큐가 가득 차면, 시스템은 maximumPoolSize에 도달할 때까지 추가 스레드를 생성

  4. 큐가 가득 차고 추가 스레드가 maximumPoolSize에 도달했을 때 어떤 방식으로 처리할지는 핸들러 정책에 의해 결정

으로 진행됩니다.

강의에도 자세하게 설명하고 있습니다.

 

0

안녕하세요, 인프런 AI 인턴입니다.

  1. ArrayBlockingQueue에 4개의 태스크가 차 있을 경우, 이 큐에 더 이상 태스크가 적재되지 못하고 해당 큐는 가득 찬 상태입니다. 이 경우 추가로 생성되는 태스크들은 corePoolSize가 설정된 기본 스레드 수를 초과하지 않는 한 기존 스레드에서 처리되거나, 설정된 maximumPoolSize 까지 새로운 스레드가 생성되어 처리됩니다. 새로운 태스크가 대기하는 위치는 스레드 풀의 내부적인 관리에 따라 다를 수 있으며, 구체적으로 ThreadPoolExecutor에 의해 관리됩니다.

  2. 최대 스레드 개수(maximumPoolSize)까지 생성된 이후에도 그 이상의 태스크가 들어올 경우, 태스크를 어떻게 처리할지 결정하는 정책(RejectedExecutionHandler)에 따라 다릅니다. 핸들러가 설정되지 않았다면 기본적으로 제공되는 핸들러는 AbortPolicy로, 이는 새로운 태스크가 도착하면 처리 할 수 없음을 알리는 RejectedExecutionException을 던집니다. 하지만, 다른 처리 방식을 정의하는 핸들러(CallerRunsPolicy, DiscardPolicy, DiscardOldestPolicy 등)를 설정할 수도 있으며, 이 경우 어떻게 처리될지는 설정된 핸들러에 따라 다릅니다.

태스크를 스레드 풀에 제출할 때, 큐와 corePoolSize, maximumPoolSize의 관계를 이해하는 것이 중요합니다. 태스크가 제출될 때, corePoolSize까지는 스레드가 생성되어 작업이 실행됩니다. 만약 모든 코어 스레드가 바쁘다면, 작업은 큐에 배치됩니다. 큐가 가득 차면, 시스템은 maximumPoolSize에 도달할 때까지 추가 스레드를 생성할 수 있습니다. 큐가 가득 차고 추가 스레드가 maximumPoolSize에 도달했을 때 어떤 방식으로 처리할지는 앞서 설명한 바와 같이 정책에 의해 결정됩니다.

큐에서 태스크가 처리되어 공간이 생기는 것은 맞습니다. 태스크 처리 속도와 제출 속도에 따라 큐가 가득 차거나 비어 있게 됩니다. 시스템의 성능과 요구에 맞게 큐의 크기와 스레드풀의 크기를 조정하여 최적의 성능을 얻을 수 있도록 해야 합니다.

강의가 유익했다니 기쁩니다. 질문에 답변이 도움이 되었기를 바랍니다.

아무도_모를_아이디님의 프로필 이미지
아무도_모를_아이디

작성한 질문수

질문하기