Java

Thread와 Thread Pool

김승진 2025. 3. 27. 00:29

 

대부분 웹 사이트나 애플리케이션은 동시에 여러 작업을 처리합니다. 어떻게 동시에 처리할 수 있을까요? 특정 작업에 대한 처리는 
스레드가 담당하며 수많은 요청, 동시 작업에 대해 효율적으로 수행하기 위해 나온 것이 스레드 (Thread Pool)입니다.



"왜 스레드가 필요하고, 스레드 풀을 왜 써야 하는가?"에 대해 보겠습니다.

대부분 웹 사이트나 애플리케이션은 동시에 여러 작업을 처리합니다. 어떻게 동시에 처리할 수 있을까요? 특정 작업에 대한 처리는 

스레드가 담당하며 수많은 요청, 동시 작업에 대해 효율적으로 수행하기 위해 나온 것이 스레드 (Thread Pool)입니다.

 

"왜 스레드가 필요하고, 스레드 풀을 왜 써야 하는가?"에 대해 보겠습니다.

 

 

스레드(Thread)란?

스레드는 하나의 프로세스 내에서 독립적으로 실행되는 작업 흐름입니다. 아래와 같은 코드 실행은 스레드가 처리합니다.
아래는 count 변수에 1을 100억번 더하는 로직입니다. 컴퓨터 성능에 따라 속도는 다르겠지만 로직이 완료되는데 3초가 걸린다고 가정해 봅시다. 만약 해당 프로그램이 하나의 스레드로 동작하고 동시에 10개 요청이 온다면 어떻게 될까요?
요청을 처리하는 데 약 30초가 걸릴 것입니다.

class Main{
    public static void main(String[] args) {
        int count = 0;
        for(int i=0; i<10000000000; i++){
            count += 1;
        }
        System.out.println(count);
}

 

빠른 응답과 처리를 위해서 많은 스레드가 필요한데 이를 무작정 만들면 다음과 같은 문제가 생길 수 있습니다.

  •  스레드 생성/제거 비용
  • 과도한 스레드로 인한 Context Switching 비용
  • 메모리 부족 및 시스템 오버헤드로 인한 자원 고갈

 

따라서 적절하게 스레드를 관리하는 것은 중요합니다. 어떻게 관리해야 할까요?

 

스레드 풀(Thread Poll)

스레드 풀은 미리 일정 수의 스레드를 만들어 놓고, 작업이 들어올 때 재사용하는 구조로 

필요할 때마다 스레드를 새로 만들지 않고, 이미 만들어진 스레드를 꺼내서 쓰고 다시 돌려놓는 방식입니다.

 

스레드 풀은 다음과 같은 장점이 있습니다.

 

  • 성능 향상: 스레드 재사용으로 생성/소멸 비용 감소
  • 자원 효율성 및 안정성: 스레드 수 제한 → 자원 고갈 방지
  • 예측 가능성: 처리량 예측 및 병렬성 조절 가능

 

 

이러한 스레드 풀의 장점으로 인해 스프링 프레임워크에서는 스레드 풀을 사용합니다. 스프링 프레임워크와 자바에서는 ExecutorService  인터페이스를 통해 쉽게 스레드 풀을 사용할 수 있습니다.

ExecutorService executor = Executors.newFixedThreadPool(3); // 최대 3개 스레드 사용

for (int i = 0; i < 10; i++) {
    final int taskId = i;
    executor.submit(() -> { // 10개의 작업이 순차적으로 3개의 스레드에 의해 처리됨
        System.out.println("Task " + taskId + " is running on " + Thread.currentThread().getName());
    });  
}

executor.shutdown(); // 더 이상 작업 제출하지 않음

이렇게 여러 스레드를 통해 빠르게 작업을 처리할 수 있습니다.

 

대부분 웹 애플리케이션은 HTTP 요청을 처리하기에 CPU 연산 작업보다는 I/O, 네트워크, HTTP, DB 접근과 같은 행위로 대기 시간이 생기기에 블로킹 처리됩니다. 따라서 스레드 풀로 여러 스레드를 사용해서 처리하는 방법이 동시에 많은 요청을 처리하기에 적합합니다.
다만 많은 스레드를 사용할수록 Context Switching도 빈번히 발생하기에 상황에 맞게 적절한 스레드 설정을 통해 관리해야 합니다.

 

'Java' 카테고리의 다른 글

Java에서 멀티 스레드와 동기화 처리  (0) 2025.04.10
자바 제네릭(Generics)의 이해와 활용  (0) 2025.03.20