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
반응형