반응형
ThreadPoolExecutor란?
ThreadPoolExecutor는 Java에서 스레드 풀을 관리하는 강력한 클래스로, 많은 양의 스레드를 효율적으로 관리하고 실행하는 데 사용됩니다. ThreadPoolExecutor는 java.util.concurrent 패키지에 포함되어 있으며, 다양한 설정 옵션을 제공하여 스레드 풀의 동작을 제어할 수 있습니다. 이를 통해 시스템 자원을 보다 효율적으로 사용하고, 성능을 최적화할 수 있습니다.
ThreadPoolExecutor의 주요 기능
- 스레드 풀 관리:
- ThreadPoolExecutor는 여러 스레드를 생성, 재사용, 종료하는 작업을 관리합니다.
- 스레드가 작업을 완료하면 풀로 반환되어 다른 작업을 처리할 준비를 합니다.
- 작업 큐 관리:
- 스레드 풀이 바쁠 때 새 작업을 대기시키기 위해 큐를 사용합니다.
- 큐의 크기와 유형은 BlockingQueue 인터페이스를 구현한 다양한 큐 클래스(LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue 등) 중에서 선택할 수 있습니다.
- 스레드 수 조절:
- corePoolSize와 maximumPoolSize를 설정하여 스레드 풀의 최소 및 최대 스레드 수를 지정할 수 있습니다.
- keepAliveTime과 TimeUnit을 사용하여 일정 시간 동안 사용되지 않은 스레드를 종료할 수 있습니다.
- 거부 정책:
- 작업이 큐에 추가될 수 없거나 모든 스레드가 바쁜 경우 거부 정책을 지정할 수 있습니다.
- 기본 거부 정책은 RejectedExecutionHandler 인터페이스를 사용하여 정의할 수 있으며, AbortPolicy, CallerRunsPolicy, DiscardPolicy, DiscardOldestPolicy 등의 기본 구현이 제공됩니다.
ThreadPoolExecutor 생성 및 사용 예시
import java.util.concurrent.*;
public class ThreadPoolExecutorExample {
public static void main(String[] args) {
// ThreadPoolExecutor 생성
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // corePoolSize (최소 스레드 개수)
4, // maximumPoolSize (최대 스레드 개수)
60L, // keepAliveTime (추가 스레드 유지 시간)
TimeUnit.SECONDS, // keepAliveTime의 시간 단위
new LinkedBlockingQueue<Runnable>(10) // 작업 큐
);
// 작업 제출 예시
for (int i = 0; i < 10; i++) {
executor.execute(new Task(i));
}
// 스레드 풀 종료
executor.shutdown();
}
}
class Task implements Runnable {
private final int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task ID : " + this.taskId + " performed by "
+ Thread.currentThread().getName());
}
}
ThreadPoolExecutor의 주요 메서드
- execute(Runnable command): 스레드 풀에 작업을 제출합니다.
- submit(Callable<T> task): 스레드 풀에 작업을 제출하고, 결과를 반환하는 Future 객체를 반환합니다.
- shutdown(): 새로운 작업을 받지 않으며, 이미 제출된 작업을 모두 완료한 후 스레드 풀을 종료합니다.
- shutdownNow(): 실행 중인 작업을 중단하고, 대기 중인 작업을 모두 버리며 즉시 스레드 풀을 종료합니다.
- getPoolSize(): 현재 스레드 풀의 스레드 수를 반환합니다.
- getActiveCount(): 현재 활동 중인 스레드 수를 반환합니다.
- getQueue(): 작업 큐를 반환합니다.
ThreadPoolExecutor의 장점
- 효율적인 리소스 사용: 스레드 재사용을 통해 스레드 생성과 종료의 오버헤드를 줄이고 시스템 자원을 효율적으로 사용합니다.
- 성능 향상: 동시에 여러 작업을 병렬로 처리하여 응답 시간을 단축하고 성능을 향상시킵니다.
- 유연성: 다양한 설정 옵션을 통해 스레드 풀의 동작을 조정할 수 있습니다.
ThreadPoolExecutor는 자바에서 고성능, 멀티스레드 애플리케이션을 개발하는 데 매우 유용한 도구입니다. 이를 통해 복잡한 스레드 관리 작업을 단순화하고, 시스템의 성능과 안정성을 크게 향상시킬 수 있습니다.
동작 방식
ThreadPoolExecutor는 다음과 같은 일반적인 동작을 합니다:
- 작업 처리:
- 새 작업이 스레드 풀에 제출되면, 풀은 적절한 작업자 스레드에게 작업을 할당합니다.
- 만약 현재 스레드 풀 크기가 corePoolSize 이하이고 모든 코어 스레드가 사용 중이지 않다면, 새 스레드가 생성됩니다.
- 큐에 여유 공간이 없거나 maximumPoolSize에 도달하면, 추가 작업은 거부될 수 있습니다(선택적으로 예외를 던지거나, 특정 정책에 따라 처리될 수 있습니다).
- 스레드 유지:
- 작업이 처리된 후, 비즈니스 로직에 따라 스레드는 재사용되거나 종료될 수 있습니다. keepAliveTime 동안 추가 작업이 없으면, corePoolSize 이상의 스레드는 종료될 수 있습니다.
- 작업 완료 및 결과 처리:
- 작업이 완료되면, 결과는 Future 객체를 통해 반환될 수 있습니다(만약 작업이 결과를 반환하는 경우).
- 작업이 예외를 발생시키면, 예외는 해당 작업을 실행한 스레드에서 처리될 수 있습니다.
반응형
'Programming > Java, Kotlin' 카테고리의 다른 글
[Java] 얕은 복사, 깊은 복사 차이, 예시 (0) | 2024.06.22 |
---|---|
[Java] 커스텀 불변 클래스란? Immutable Class 특징, 예, 이점 (0) | 2024.06.22 |
[Java] 가비지 컬렉션이란? (가비지가 객체를 수집하는 방법, 사용하는 알고리즘) (0) | 2024.06.22 |
[Java] JVM 이란? 자바 메모리(메모리 각 영역에 객체, 메소드 및 변수를 저장하는 법) (0) | 2024.06.22 |
[Java] 멀티스레드, 스레드풀이란? 사용예시, 장단점, 차이점 (0) | 2024.06.22 |