ThreadPoolExecutor
(
int corePoolSize, // 최소 스레드 개수 (스레드풀이 idle 상태여도 이 스레드 개수는 유지됨)
int maximumPoolSize, // 최대 스레드 개수
long keepAliveTime, // 스레드 개수가 corePoolSize를 넘었을 경우, idle 스레드를 끝낼때까지의 스레드 유지시간
TimeUnit unit,
BlockingQueue<Runnable> workQueue, // 대기 중인 스레드를 보관할 큐
ThreadFactory threadFactory, // 새로운 스레드를 생성할때 사용한 스레드 팩토리
RejectedExecutionHandler handler // workQueue가 가득 찼을 경우 실행할 작업 거부 핸들러
)
workQueue로 보통 다음의 녀석들을 사용한다.
큐의 크기가 제한되어 있기 때문에 자원 사용량을 한정시킬 수 있다
스레드 개수가 많거나 제한이 거의 없는 경우에 사용
스레드풀이 추가적인 스레드를 생성하는 시점은 workQueue에 삽입하려는 동작(offer)이 실패하고, 스레드풀의 스레드 개수가 maximumPoolSize 보다 작을때 새로운 스레드를 풀에 생성한다.
LinkedBlockingQueue는 크기 제한이 없다면 메모리가 되는 한 한계가 없는 큐다. 따라서 메모리 한계에 다다르기 전까지 삽입(offer) 동작이 실패할 일이 없다.
반면, SynchronousQueue는 내부 버퍼 공간이 없기 때문에, 스레드풀의 여유 스레드가 없다면 maximumPoolSize 까지 생성된다
참고