카테고리 없음

ThreadPoolExecutor 주의사항 : Queue사이즈와 MaxPoolSize

가을맛 2025. 3. 14. 23:37


ThreadPoolExecutor의 Queue사이즈를 default값(Integer.MAX_VALUE)로 사용할 때는 CorePoolSize를 초과해서 스레드 개수가 늘어나지 않는다. 

예를들어, CorePoolSize 100, MaxPoolSize 200 처럼 설정하는 경우, 스레드는 최대 100개까지만 생성되고 그 이상으로 늘어나지 않지 않는다. 

- CorePoolSize는 기본적으로 생성 되는 스레드 수
- MaxPoolSize는 "큐가 가득 차면" 그 이후에  최대 이 크기만큼 스레드 수가 늘어날 수 있음을 의미

여기서 핵심 포인트는 "큐가 가득 차면" 이다. ThreadPoolExecutor에서 기본적으로 사용하는 큐는 LinkedBlockingQueue이고, 이는 무제한 용량을 가진 블록킹 큐이다 따라서 큐 사이즈를 기본값 ( Integer.MAX_VALUE  => 무한)으로 설정해두면, 절대 큐가 가득 찰 수 없다!

따라서 CorePoolSize 100, MaxPoolSize 200 로 설정해 둔 경우 아무리 작업이 밀려들어와도.... 기본 스레드 100개만으로 작업을 계속하게 된다. 

 

결론

따라서 스레드 수가 상황에 따라 유연하게 변하길 원한다면 아래와 같은 방식을 고려해볼 수 있다.
1. Executors.newCachedThreadPool() -> 내부적으로 size가 0인 큐를 사용하고 있어서 큐에 저장하지 않고 바로 produce -> *무한개*의 스레드가 생성될 수 있다 
2. ThreadPoolExecutor 에서 큐 사이즈를 제한

    @Bean
    fun myThreadPoolTaskExecutor(): Executor? {
        val executor = ThreadPoolTaskExecutor()
        executor.corePoolSize = 5
        executor.maxPoolSize = 30
        executor.setQueueCapacity(10) // 큐 사이즈를 제한

        return executor
    }