SchedulingConfigurer과 쓰레드풀

dalBeen·2023년 10월 1일

스프링

목록 보기
6/14

스레드풀

  • 병렬작업 처리가 많아지면 스레드 개수가 증가되고, 그에 따른 쓰레드 생성과 스케줄링으로 인해 CPU가 바빠져 메모리 사용량이 늘어난다. 이는 애플리케이션 성능 저하로 이어진다.
  • 병렬 작업의 폭증으로 인한 스레드의 폭증을 막으려면 스레드 풀을 사용해야함
  • 스레드풀은 작업 처리에 사용되는 스레드를 제한된 개수 만큼 정해놓고 작업 큐를 들어오는 작업들을 하나씩 스레드가 맡아 처리한다
  • 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리함
  • 작업처리 요청이 폭증해도 작업큐라는 곳에 작업이 대기하다가 여유가 있는 스레드가 그것을 처리하므로 스레드의 전체 개수는 일정하며 애플리케이션의 성능도 저하되지 않음


SchedulingConfigurer

@Scheduled(fixedDelay=1000)
public void test1() throws InterruptedException{
	Thread.sleep(10000);
    System.out.prinln(Thread.currentThread().getName());
}

@Scheduled(fixedDelay=1000)
public void test1() throws InterruptedException{
 System.out.prinln(Thread.currentThread().getName());
}

스케줄러 스레드는 별도의 스레드 설정이 없으면 단일 스레드 이기때문에 test1와 test2가 하나의 스레드를 번갈아가면서 사용.
다만 하나의 메소드가 완료된후 다음 메소드가 실행됨

만약 두개를 동시에 작업하고 싶다면 SchedulingConfigurer 사용


SchedulingConfigurer

스프링 프레임워크의 스케줄링 기능을 사용할때 스케줄링 구성을 커스터마이징 하기 위한 인터페이스
-> 스케줄러의 동작방식을 세부적으로 설정하거나 조정할 필요가 있을때 사용

다음과 같은 상황에서 유용

  • 복수의 작업을 동시에 실행하려는 경우
  • 스케줄링 작업에 대한 세밀한 제어가 필요한 경우
  • 프로그램의 실행 도중에 스케줄링 작업을 동적으로 추가하거나 제거하려는 경우
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

        scheduler.setPoolSize(POOL_SIZE);
        scheduler.setThreadNamePrefix("scheduled-task-");
        scheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(scheduler);
    }
}
profile
깊게 공부해보자

0개의 댓글