본문 바로가기
Develop/Java

[Java] Thread 클래스와 ThreadPoolExecutor 클래스

by 독서왕뼝아리 2023. 9. 10.

단순 Thread 클래스를 사용하게 되면?

자바8 기준 사용자 레벨 스레드를 사용하지 않음

JVM을 통해 OS의 시스템콜을 호출하여 커널 스레드를 1:1로 할당 받음

 

⇒ 스레드 생성 비용이 너무 크다!!!!!!!!!!!!!!!!!!!!!

 

 

(스레드 맵핑과 관련한 글은 아래 글에서 확인하실 수 있습니다.)

2023.09.10 - [컴퓨터공학/운영체제] - [운영체제?] 스레드의 종류(하드웨어스레드, 커널레벨스레드, 유저레벨스레드)

 

 

 

헉! 그럼 자바에서 스레드를 사용하면 비효율적이네요!

 

 

하지만 당근빠따루 스레드풀을 사용할 수 있음

concurrent 패키지의 ThreadPoolExecutor 클래스로 사용

 

⚠️  Executors.newFixedThreadPool(100)로 생성 시
작업 큐 사이즈가 Integer.MAX_VALUE로 설정됨
즉, 잠재적 위험 요인이 있다를 인식하고 사용해야 함

Python 또한 사이즈 제한 없는 큐를 사용

 

Tomcat의 스레드

  • Java와 매우 유사한 자체 스레드풀 구현체를 가지고 있다!
    org.apache.tomcat.util.threads.ThreadPoolExecutor

❗자바와 추가적으로 다른 점

Max Connections

  • 톰캣이 최대로 처리할 수 있는 connection의 개수
  • web 요청이 들어오면 톰캣의 Connector가 Connection을 생성하면서 Thread Pool의 Thread에 연결

Accept Count

  • max connection 이상의 요청이 들어왔을 때 사용하는 대기열 queue의 사이즈
  • max connection 과 accept count 이상의 요청이 들어오면 거절됨

 

우리가 스레드풀 설정을 해야 하는 이유

  • 스레드풀은 응답시간과 TPS에 영향을 주게됨
  • 잘 조절된 스레드풀은 시스템의 성능을 올리고 안정적인 운용 가능하게 함
  • 부적절한 스레드풀 설정은 병목 현상, 오버헤드, 메모리 문제 유발
  • 개념과 설정을 알고 있어야 더 좋은 server application 개발할 수 있게 됨ㅎㅎ