본문 바로가기
Spring

멀티 스레드 환경을 위한 스레드 풀 (Thread pool) - ThreadPoolTaskExecutor

by yang sing 2023. 6. 6.

안녕하세요.

지난 포스팅에서는 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를 통한 비동기 멀티 스레드에 대해 포스팅을 해보겠습니다.

 

참고 

https://coor.tistory.com/33

'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