본문 바로가기
Java

java ThreadPoolExecutor 설명

by 무대포 개발자 2021. 2. 26.
728x90
반응형

java ThreadPoolExecutor 설명

개념

  • ThreadPoolExecutor 는 ThreadPool 을 관리해주는 역할

ThreadPoolExecutor 환경 설정

  • corePoolSize : 초기에 corePoolSize 만큼 스레드가 생성되며, 이를 유지함.
  • maximumPoolSize : ThreadPool 에서 최대로 유지할 수 있는 Thread 갯수
  • workQueue : corePoolSize 초과하는 요청에 대해 큐에 담는다.
    • 예를 들면, corePoolSize : 1 이고, workQueue : 10 이며, 요청 스레드는 10이라 가정하면 corePoolSize 에서 1개 스레드로 처리하고 큐에는 9개 요청이 대기하고 있음.

Case 별 ThreadPoolExecutor 동작

case1. 요청 스레드가 10개, corePoolSize 1개, WorkQueue 10개, maximumPoolSize : 5
  • 초기에 corePoolSize 만큼 스레드가 생성되고 1개 스레드를 처리.
  • 9개 요청은 큐에 담겨져 있어서. 요청을 처리할 때마다 큐에서 1개씩 빼서 처리.
case2. 요청 스레드가 10개, corePoolSize 1개, workQueue 5개, maximumPoolSize : 5개
  • 초기에 corePoolSize 만큼 스레드가 생성되고 1개 스레드를 처리.
  • 큐에 5개 쌓이고, 요청 스레드가 4개 남음.
  • ThreadPool 이 maximumPoolSize (5개) 만큼 스레드를 생성해 나머지 요청 스레드를 처리함.
  • 요청 스레드를 처리하고, ThreadPool 은 일정시간이 흐른 후, corePoolSize 를 유지.
case3. 요청 스레드가 10개, corePoolSize 1개, workQueue 5개, maximumPoolSize : 2개
  • 초기에 corePoolSize 만큼 스레드가 생성되고 1개 스레드를 처리.
  • 큐에 5개가 쌓이고, 요청 스레드가 4개 남음.
  • ThreadPool 에서 thread 를 maximumPoolSize (2개) 까지 늘림.
  • 그래도 요청 스레드가 3개 남음. 요청 스레드를 처리할 스레드가 없다고 에러 남.

ThreadPool 과 OS core 관계

  • 좀 다른 주제일 수 있지만 생각나는 김에 적어 봤음.
  • 하나의 JVM 은 하나의 프로세스에서 동작한다. 하나의 프로세스 안에는 여러개의 스레드가 동작한다.
  • 수십개의 요청이 들어와서 ThreadPool 에서 스레드를 하나씩 꺼내서 처리한다고 가정해보자.
  • 이 때, 이 스레드들은 하나의 core 에서 동작할까? 정답은 멀티 core 에서 동작한다는 것이다.
  • 하나의 JVM 은 하나의 프로세스에서 동작한다면, 하나의 core 에서만 스레드가 동작할 것이라 생각되지만.
  • 요즘 OS 시스템은 스레드 단위로 스케줄링을 처리할 수 있다.
  • 즉, JVM 내에서 스레드를 할당해 요청을 처리해도 OS System 에서 여러 core 에 스케줄링해서 멀티 core 로 처리할 수 있다.

reference

'Java' 카테고리의 다른 글

Java State Pattern  (0) 2021.04.04
java Generic, WildCard 정리  (0) 2021.03.22
List 안의 값 중 가장 큰 데이터 출력  (0) 2021.02.20
java main args 에 json parameter 넘기는 방법  (0) 2021.02.06
apache webserver error page customize  (0) 2021.01.24

댓글