일상&개발 로그

ThreadPoolExecutor에서 corePoolSize와 queue capacity의 관계 본문

개발/개발 일반

ThreadPoolExecutor에서 corePoolSize와 queue capacity의 관계

dskim98 2018. 8. 3. 16:29

ThreadPoolExecutor는 ExecutorService를 상속받은 클래스로

Task(Runnable)를 저장하는 BlockingQueue와 이를 수행하는 ThreadPoolSize를 설정할 수 있다.


ThreadPoolExecutor 생성자에서 corePoolSize와 maximumPoolSize, BlockingQueue를 지정할 수 있는데,

여기서 지정하는 BlockingQueue의 capacity가 unbound인 경우, threadPoolSize는 corePoolSize에서 늘어나지 않는다.

구동되는 threadPool의 크기를 maximumPoolSize만큼 늘리려면 BlockingQueue의 capacitiy를 지정해 줘야한다.

주의할 점은 capacity를 지정할 경우 corePoolSize + capacity를 넘어가는 요청이 들어오게 되면 따로 Policy를 지정해주지 않으면 RejectedExecutionException이 발생하게 되므로, 잘 고려해서 설정해야 한다.


정리하자면 아래 표와 같다.

 형태

 queue예시 

 동작 

 bound

 ArrayBlockingQueue

 queue의 capacity를 넘어가는 task요청이 들어오면 maximumPoolSize까지 threadPoolSize를 늘리고, 그래도 부족하면 RejectedExecutionException이 발생한다.

 unbound

 LinkedBlockingQueue
 (capacity 설정x)

 corePoolSize를 넘어가는 task요청이 들어오면 threadPoolSize를 변경시키지 않고, 수행중인 task가 종료될 때까지 대기한다. maximumPoolSize는 의미가 없다.


Comments