ThreadPoolExecutor
(
    int corePoolSize,                    // 최소 스레드 개수 (스레드풀이 idle 상태여도 이 스레드 개수는 유지됨)
    int maximumPoolSize,                 // 최대 스레드 개수
    long keepAliveTime,                  // 스레드 개수가 corePoolSize를 넘었을 경우, idle 스레드를 끝낼때까지의 스레드 유지시간
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,   // 대기 중인 스레드를 보관할 큐
    ThreadFactory threadFactory,         // 새로운 스레드를 생성할때 사용한 스레드 팩토리
    RejectedExecutionHandler handler     // workQueue가 가득 찼을 경우 실행할 작업 거부 핸들러
)

workQueue로 보통 다음의 녀석들을 사용한다.

(1) ArrayBlockingQueue 또는 크기가 제한된 LinkedBlockingQueue

큐의 크기가 제한되어 있기 때문에 자원 사용량을 한정시킬 수 있다

(2) SynchronousQueue

스레드 개수가 많거나 제한이 거의 없는 경우에 사용

LinkedBlockingQueue와 SynchronousQueue 비교 & 스레드풀의 스레드 생성

스레드풀이 추가적인 스레드를 생성하는 시점은 workQueue에 삽입하려는 동작(offer)이 실패하고, 스레드풀의 스레드 개수가 maximumPoolSize 보다 작을때 새로운 스레드를 풀에 생성한다.

LinkedBlockingQueue는 크기 제한이 없다면 메모리가 되는 한 한계가 없는 큐다. 따라서 메모리 한계에 다다르기 전까지 삽입(offer) 동작이 실패할 일이 없다.

반면, SynchronousQueue는 내부 버퍼 공간이 없기 때문에, 스레드풀의 여유 스레드가 없다면 maximumPoolSize 까지 생성된다


참고