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

황제연·2025년 8월 12일
0

CS학습

목록 보기
164/193
post-thumbnail

Executor 프레임워크가 스레드를 관리하는 방법

ExecutorService의 기본 구현체인 ThreadPoolExecutor의 생성자는
다음과 같은 속성을 사용합니다

  • corePoolSize: 스레드 풀에서 관리되는 기본 스레드 수
  • MaximumPoolSize: 스레드 풀에서 관리되는 최대 스레드 수
  • keepAliveTime, TimeUnit unit: 기본 스레드 수를 초과해서 만들어진 초과 스레드가 생존할 수 있는 대기시간으로 이 시간동안 처리할 작업이 없으면 초과 스레드는 제거됩니다
  • BlockingQueue workQueue: 작업을 보관할 블로킹 큐

초과 스레드

스레드 풀에 기본 2개의 스레드를 운영한다고 가정했을 때, 요청이 너무 많거나 급한 경우
스레드 풀이 최대 4개까지 스레드를 증가시켜서 사용할 수 있습니다

이렇게 기본 스레드 수를 초과해서 만들어진 스레드를 초과 스레드라고 합니다

시간 설정

초과 스레드가 생존할 수 있는 대기시간도 설정할 수 있습니다
이 시간동안 초과 스레드가 처리할 작업이 없다면 초과 스레드는 제거됩니다

Executor 스레드 풀 관리 전략

  1. 사용자가 작업을 요청하면 core 사이즈만큼 스레드를 만듭니다
  2. core사이즈를 초과하면 큐에 작업을 넣습니다
  3. 큐를 초과하면 max사이즈만큼 스레드를 만듭니다. 이때 임시로 사용되는 초과 스레드가 생성됩니다
    큐가 가득차서 큐에 넣을 수 없으면 초과 스레드가 바로 수행해야 합니다
  4. max 사이즈를 초과하면 요청을 거절하고 RejectedExecutionException예외가 발생합니다
    큐가 가득차고, 스레드 풀에 최대 생성 가능한 스레드 수가 가득찼으므로 작업을 받을 수 없는 상황입니다

스레드 미리 생성하기

응답시간이 중요한 서버라면 미리 스레드 풀에 생성하는 전략을 선택할 수 있습니다
ThreadPoolExecutor.prestartAllCoreThreads()를 사용하면 기본 스레드를 미리 생성할 수 있습니다
참고로 ExecutorService는 해당 메소드를 제공하지 않습니다

참고

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

0개의 댓글