1.스레드 풀이란 무엇인가요?
스레드 풀은 실제로 멀티 스레드 처리의 한 형태로, 처리 중에 작업을 대기열에 추가할 수 있으며 스레드가 생성된 후 이러한 작업이 자동으로 시작될 수 있습니다.
2. 스레드 풀을 사용하는 이유:
1. 스레드 생성 및 소멸 횟수를 줄이면 각 작업자 스레드를 재사용하고 여러 작업을 수행할 수 있습니다.
2. 과도한 메모리 소모로 인해 서버가 소진되는 것을 방지하기 위해 시스템 용량에 따라 스레드 풀에서 작동하는 스레드 수를 조정할 수 있습니다. (각 스레드에는 약 1MB의 메모리가 필요합니다. 더 많은 스레드가 열릴수록 더 많은 메모리가 필요합니다.) 메모리가 더 커지고 결국에는 충돌이 발생합니다.)
3. 자원 소비를 줄입니다. 생성된 스레드를 재사용하여 스레드 생성 및 소멸 비용을 줄입니다.
4. 응답 속도를 향상시킵니다. 작업이 도착하면 스레드가 생성될 때까지 기다리지 않고 즉시 작업을 실행할 수 있습니다.
5. 스레드 관리성을 향상시킵니다. 스레드는 희소한 자원이므로 제한 없이 생성할 경우 시스템 자원을 소모할 뿐만 아니라 시스템의 안정성을 저하시키므로 스레드 풀을 통합 할당, 튜닝, 모니터링 등에 사용할 수 있습니다.
Java에서 스레드 풀의 최상위 인터페이스는 Executor이지만 엄밀히 말하면 Executor는 스레드 풀이 아니라 스레드를 실행하기 위한 도구일 뿐입니다. 실제 스레드 풀 인터페이스는 ExecutorService입니다.
3. 스레드 풀의 7개 매개변수
corePoolSize 스레드 풀 코어 스레드 크기
maximumPoolSize 스레드 풀의 최대 스레드 수
keepAliveTime 유휴 스레드 생존 시간
단위 유휴 스레드 생존 시간 단위
workQueue 작업 대기열
threadFactory 스레드 팩토리
핸들러 거부 정책
4. 일반적으로 사용되는 Thread Pool (4종)
- 고정 길이 스레드 풀(FixedThreadPool)
newFixedThreadPool은 최대 동시 스레드 수를 제어할 수 있는 고정 길이 스레드 풀을 생성하며, 초과하는 스레드는 대기열에서 대기합니다.
- 예약된 스레드 풀(ScheduledThreadPool)
newScheduledThreadPool은 예약된 스레드 풀을 생성하여 예약되고 주기적인 작업 실행을 지원합니다.
- 캐시 가능한 스레드 풀(CachedThreadPool)
newCachedThreadPool은 캐시 가능한 스레드 풀을 생성하는데, 스레드 풀의 길이가 처리 요구량을 초과하면 유휴 스레드를 유연하게 재활용할 수 있으며, 재활용할 수 없는 경우에는 새 스레드를 생성합니다.
- 단일 스레드 스레드 풀(SingleThreadExecutor)
newSingleThreadExecutor는 작업을 실행하는 유일한 작업 스레드만 갖는 단일 스레드 스레드 풀을 생성하여 모든 작업이 지정된 순서(FIFO, LIFO, 우선 순위)로 실행되도록 보장합니다.