2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

스레드풀의 작업 큐가 가득 찼을 때의 처리 방법은 무엇인가요?

_____
Q: 스레드풀의 작업 큐가 가득 찼을 때는 어떻게 처리되나요?

A: 스레드풀의 작업 큐가 가득 차면, 기본적으로 스레드풀의 설정에 따라 다음 3가지 방식 중 하나로 처리가 이루어집니다.

1. 거부 정책(RejectedExecutionHandler) 실행
- 스레드풀은 작업을 더 이상 큐에 추가할 수 없을 때, 작업 요청을 거부하고 거부 정책을 수행합니다. 이 정책은 다음과 같은 표준 구현체가 있습니다.
- `AbortPolicy`: 작업 제출 시 `RejectedExecutionException` 예외를 던져 제출을 거부합니다.(기본값)
- `CallerRunsPolicy`: 호출한 스레드(작업 제출 스레드)에서 직접 작업을 실행하여 처리를 지연시키고 백프레셔를 제공합니다.
- `DiscardPolicy`: 작업을 조용히 버리고 아무 동작도 하지 않습니다.
- `DiscardOldestPolicy`: 작업 큐에서 가장 오래된 작업을 제거하고 새 작업을 큐에 추가하는 방식입니다.

2. 작업 제출 대기(Blocking)
- 스레드풀 구현에 따라 큐가 가득 차면 작업 제출이 블록될 수 있습니다. 예를 들어, `SynchronousQueue`를 사용하는 경우 작업 제출 시 워커 스레드가 즉시 작업을 가져가지 않으면 작업 제출이 블록됩니다. 하지만 JDK 기본 스레드풀에서는 별도 설정 없이는 자동 블록은 발생하지 않고 거부 정책이 실행됩니다.

3. 커스텀 처리
- 개발자가 직접 `RejectedExecutionHandler` 를 구현해 로그 기록, 작업 재시도, 작업 저장소에 임시 저장 등 커스텀 작업 처리 로직을 지정할 수 있습니다.

---

요약
- 작업 큐가 가득 차면 스레드풀은 기본적으로 `RejectedExecutionHandler`를 호출합니다.
- 기본 정책은 예외 발생(AbortPolicy)이며, 그 외의 정책 혹은 직접 구현한 핸들러로 동작을 변경할 수 있습니다.
- 블로킹 대기는 구현별로 다르며, 표준 `ThreadPoolExecutor`는 직접 지원하지 않고 대신 예외를 발생시킵니다.
- 따라서, 작업 큐 크기를 적절히 조절하고 적합한 거부 정책을 설정하여 안정적인 작업 처리를 설계하는 것이 중요합니다.
스레드풀(Thread Pool)은 멀티스레딩 환경에서 효율적으로 작업을 처리하기 위해 미리 생성된 스레드의 집합을 관리하는 구조입니다.

스레드풀을 사용하면 스레드를 매번 생성하고 소멸시키는 비용을 줄일 수 있으며, 시스템 자원을 효율적으로 사용할 수 있습니다.

그러나 스레드풀의 작업 큐가 가득 차게 되면, 새로운 작업을 처리하는 데 어려움이 발생할 수 있습니다.

이 경우의 처리 방법에 대해 자세히 살펴보겠습니다.

1. 작업 큐의 종류 이해하기 스레드풀의 작업 큐는 일반적으로 다음과 같은 유형으로 나뉩니다: - 무한 큐 (Unbounded Queue) : 작업이 무한히 추가될 수 있는 큐입니다.

이 경우, 스레드풀의 스레드 수가 고정되어 있어도 큐가 가득 차는 일이 발생하지 않지만, 메모리 부족 문제를 일으킬 수 있습니다.

- 유한 큐 (Bounded Queue) : 큐의 크기가 제한되어 있는 경우입니다.

이 경우, 큐가 가득 차면 새로운 작업을 추가할 수 없게 됩니다.



2. 큐가 가득 찼을 때의 처리 방법 스레드풀의 작업 큐가 가득 찼을 때, 다음과 같은 여러 가지 처리 방법을 고려할 수 있습니다: a. 작업 거부 정책 (Rejection Policy) 스레드풀에서는 큐가 가득 찼을 때 새로운 작업을 어떻게 처리할지를 결정하는 작업 거부 정책을 설정할 수 있습니다.

일반적으로 다음과 같은 정책이 있습니다: - AbortPolicy : 새로운 작업이 들어오면 `RejectedExecutionException`을 발생시킵니다.

이는 기본 정책으로, 작업이 거부되었음을 알립니다.

- CallerRunsPolicy : 작업을 제출한 스레드가 직접 작업을 실행하도록 합니다.

이 방법은 시스템의 부하를 줄이는 데 도움이 될 수 있지만, 호출한 스레드의 성능에 영향을 줄 수 있습니다.

- DiscardPolicy : 새로운 작업을 무시하고 버립니다.

이 방법은 간단하지만, 중요한 작업이 손실될 수 있습니다.

- DiscardOldestPolicy : 큐에서 가장 오래된 작업을 버리고 새로운 작업을 추가합니다.

이 방법은 최신 작업을 우선시하지만, 오래된 작업이 손실될 수 있습니다.

b. 스레드풀 크기 조정 스레드풀의 최대 스레드 수를 조정하여 더 많은 작업을 처리할 수 있도록 할 수 있습니다.

그러나 이 방법은 시스템 자원에 대한 부담을 증가시킬 수 있으므로 신중하게 결정해야 합니다.

c. 작업 우선순위 설정 작업에 우선순위를 부여하여 중요한 작업이 먼저 처리되도록 할 수 있습니다.

이를 위해 우선순위 큐를 사용할 수 있으며, 스레드풀에서 작업을 처리할 때 우선순위에 따라 작업을 선택합니다.

d. 비동기 처리 및 이벤트 기반 아키텍처 비동기 처리 모델이나 이벤트 기반 아키텍처를 도입하여 작업을 비동기적으로 처리할 수 있습니다.

이를 통해 스레드풀의 부하를 줄이고, 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행할 수 있습니다.



3. 모니터링 및 조정 스레드풀의 성능을 모니터링하고, 필요에 따라 조정하는 것이 중요합니다.

작업 큐의 길이, 스레드의 상태, 작업 처리 시간 등을 모니터링하여 시스템의 부하를 관리하고, 적절한 조치를 취할 수 있습니다.

결론 스레드풀의 작업 큐가 가득 찼을 때의 처리 방법은 다양하며, 시스템의 요구 사항과 특성에 따라 적절한 방법을 선택해야 합니다.

작업 거부 정책, 스레드풀 크기 조정, 작업 우선순위 설정, 비동기 처리 등을 통해 효율적으로 작업을 관리하고 시스템의 성능을 최적화할 수 있습니다.

작성자: 최민재 [비회원] | 작성일자: 1년 전 2024-11-21 22:51:40
조회수: 193 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.