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
}
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
}