Language/JAVA

[자바 멀티스레딩] 스레드 풀: ExecutorService 사용법

YoonJong 2025. 3. 27. 20:22
728x90
반응형

ExecutorService 를 사용해서 스레드를 효율적으로 관리할 수 있다.

 

스레드 풀

- 매번 스레드를 새로 생성하면 오버헤드가 크다.

- 미리 스레드를 만들어 놓고 재사용하는 방식을 사용한다.

- 작업을 큐에 넣으면 스레드 풀에서 꺼내 실행한다.

- 스레드 생성/소멸 비용을 줄이고, 시스템 자원 관리를 효율적으로 가능하다.

 

ExecutorService

- 스레드 풀을 관리하는 자바 유틸리티

- Executors 클래스로 생성 가능 

- 작업은 submit() 메서드로 큐에 추가

- 스레드 수 제한 가능, 작업 대기열 관리, 종료 제어 가능

 

예제

- 2개 스레드가 번갈아 작업 처리

- 결과값은 다를 수 있음 (스케줄링에 따라 다르다)

 

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
    	// 고정 크기 스레드 풀 생성, 작업이 많아도 n개만 실행
        ExecutorService executor = Executors.newFixedThreadPool(2);

        for (int i = 1; i <= 5; i++) {
            int taskId = i;
            executor.submit(() -> {
                System.out.println("Task " + taskId + " running on " + Thread.currentThread().getName());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        
		// 풀 종료. 새 작업 받지 않고 기존 작업 완료 후 종료
        // executor.shutdownNow(); // 즉시 종료 시도. 실행 중 작업 중단 가능
        // executor.awaitTermination(5, TimeUnit.SECONDS); // n초 동안 기다리고나서 작업 중단 가능
        executor.shutdown();
    }
}


// 실행결과
Task 1 running on pool-1-thread-1
Task 2 running on pool-1-thread-2
Task 3 running on pool-1-thread-1
Task 4 running on pool-1-thread-2
Task 5 running on pool-1-thread-1

 

 

- 실행결과가 2,1,3,5,4 이렇게 나올 수 있다 

1,2,3,4,5 순서대로 나오길 원하면 단일 스레드(newSingleThreadExecutor)를 사용하는 것이 가장 간단하며,

동기화로 순서를 제어하는 방법이 있다.

 

참고 : CountDownLatch , synchronized 

728x90
반응형