[CS/운영체제] 멀티스레드와 동시성 - 44부

황제연·2025년 8월 15일
0

CS학습

목록 보기
167/193
post-thumbnail

커스텀 풀 전략

앞선 상황을 다음과 같이 세분화된 전략으로 치환한다면 상황을 대응할 수 있습니다

  • 일반: 일반적인 상황에는 CPU, 메모리 자원을 예측할 수 있도록 고정 크기의 스레드로 운영합ㄴ다
  • 긴급: 사용자의 요청이 갑자기 증가하면 스레들르 추가해서 작업을 빠르게 처리합니다
  • 거절: 사용자의 요청이 폭증해서 긴급대응이 어렵다면 사용자의 요청을 거절합니다

즉, 커스텀 풀 전략을 사용해서 상황에 맞게 유연하게 대응할 수 있도록 전략을 세우면 됩니다

ExecutorService service = new ThreadPoolExecutor(200, 300, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));

위와같이 설정하면 200개의 기본스레드와 100개의 초과 스레드를 사용할 수 있습니다
초과 스레드는 60초의 수명을 가지며 1000개의 작업이 큐에 대기할 수 있습니다

처리 시나리오

일반

500개 이하의 작업이 큐에 담겨있으면 200개의 기본 스레드가 처리합니다

긴급

큐에 담긴 작업이 500개를 초과하면 200개의 기본 스레드와 100개의 초과 스레드가 처리합니다

거절

초과 스레드를 투입해도 큐에 담긴 작업이 500개를 초과하며 초과 스레드 개수도 오버한 상황이 ㄴ경우,
예외를 발생시킵니다

주의할점

new ThreadPoolExecutor(200, 300, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());

위와같이 설정하면 큐가 최대 사이즈만큼 늘어나지 않습니다
큐가 가득차야지 긴급 상황으로 인지하는데 LinkedBlockingQueue를 기본생성자를 통해
무한대의 사이즈로 사용하면 큐가 가득찰 수 없습니다
따라거 기본 스레드 100개만으로 무한대의 작업을 처리해야하므로 이런 경우를 주의해서 피해야합니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글