안녕하세요.
지난 포스팅에서는 java 멀티 스레드에 대해 간단하게 설명을 드렸습니다.
이번 포스팅에서는 멀티 스레드를 더 효율적으로 사용할 수 있는 스레드 풀(Thread Pool)에 대해서 작성을 하고자 합니다.
스레드 풀이란.
- 멀티 스레드 환경에서 무차별적으로 생성되는 스레드로 인한 성능 저하를 막기 위해 정해진 수의 스레드를 설정하여 사용하는 방식
- 미리 생성된 또는 이전에 생성된 스레드를 재사용하여 현재 작업을 수행
- 스레드 생성 오버 헤드 문제에 대한 해결책을 제공
Java에서의 스레드 풀
java에서 제공해주는 스레드 풀로는 ThreadPoolExecutor 클래스가 존재한다.
ThreadPoolExecutor 클래스의 자세한 사용 방법은 해당 링크를 참고하자.
이번 포스팅에서는 ThreadPoolExecutor 클래스를 사용하는 Spring의 ThreadPoolTaskExecutor에 대해서 소개하고자 한다.
ThreadPoolTaskExecutor란
- 스프링에서 제공해주는 기본 클래스로 ThreadPoolExecutor를 사용하여 구현이 되어있다.
- 스레드의 개수, 최대 스레드의 개수, 작업 대기열 등 미리 설정을 통해 만들어 두고 작업이 들어오면 스레드를 할당 한다.
- 비동기 멀티 스레드를 효율적으로 사용할 수 있게 해준다.
1. ThreadPoolTaskExecutor 설정
- config 설정을 이용해 Bean으로 등록
@Configuration
public class TestThreadConfig {
@Bean(name = "testThreadExecutor")
public TaskExecutor testThreadExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 스레드 풀에서 사용할 기본 스레드 개수
executor.setCorePoolSize(1);
// 스레드 풀에서 사용할 수 있는 최대 스레드 개수
executor.setMaxPoolSize(1);
// 스레드 풀에서 사용할 큐의 최대 크기
executor.setQueueCapacity(10);
// 반납된 스레드가 죽기까지 살아있는 시간
executor.setKeepAliveSeconds();
// 스레드명 프리픽스
executor.setThreadNamePrefix("TEST_Thread_");
executor.initialize();
return executor;
}
}
2. ThreadPoolTaskExecutor 동작 원리
- 기본 설정 스레드의 개수가 다 사용중이면 사용 가능한 스레드가 나올 때까지 큐에 대기
- 큐에 작업이 꽉차면 최대 스레드 개수만큼 스레드 생성
- 최대 스레드가 사용중이고 큐에 작업이 꽉차면 RejectedExecutionException 발생
- corePoolSize -> queueCapacity -> MaxPoolSize 순으로 동작
3. ThreadPoolTaskExecutor 사용
- 스레드 풀을 사용하고자 하는 위치에서 위에서 등록한 Bean을 주입 받아 사용
public class testService{
@Autowired
@Qualifier("testThreadExecutor")
private TaskExecutor testThread;
public testMethod(){
...
// 스레드 생성
Runnable sendMessage = new SendMessageThread();
// 스레드 풀을 이용한 스레드 실행
testThread.execute(sendMessage);
}
}
Spring boot 환경에서 멀티 스레드 풀을 설정하고 사용하는 방법을 포스팅 했습니다.
ThreadPoolTaskExecutor는 비동기로 사용하기도 쉽다고 적었는데
다음 포스팅에서는 @Async를 통한 비동기 멀티 스레드에 대해 포스팅을 해보겠습니다.
참고
'Spring' 카테고리의 다른 글
Object Storage 이미지 출력 (0) | 2023.06.09 |
---|---|
@Asnyc를 이용한 멀티 스레드 (0) | 2023.06.08 |
멀티 스레드 Runnable (0) | 2023.06.06 |
MyBatis (0) | 2023.06.04 |
jdbc와 jdbcTemplate (0) | 2022.10.21 |