java

[java]자바 스케줄러_스레드를 다중으로 생성하여 유지하는 방법(feat.ThreadPoolTaskScheduler)

seulhasony 2023. 8. 8. 14:02

자바 스케줄러를 이용해 아래의 코드를 작성했다.

원하는 결과는 test1이 Thread.sleep으로 10초간 멈춰 있을 때, test2 메소드는 10번 실행되는 것이었다.

    @Scheduled(fixedDelay = 1000)
    public void test1() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println(Thread.currentThread().getName() + " (test1) ::: " + LocalDate.now());
    }
    
    @Scheduled(fixedDelay = 1000)
    public void test2() throws InterruptedException {
        System.out.println(Thread.currentThread().getName() + " (test2) ::: " + LocalDate.now());
    }

 

그러나, 결과는 하기 사진과 같았다.

TEST1 메소드와 TEST2의 메소드는 동일한 스레드를 사용하였기 때문에 원하는 결과가 나오지 않았다.

ThreadPool이 반영되기 전

 

해결 방법으로 config 파일에 ThreadPoolTaskScheduler을 이용해서 Pool 사이즈를 코어 개수로 set해주는 것이다!

코드는 아래와 같다.

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        int n = Runtime.getRuntime().availableProcessors(); //코어 개수
        //ThreadPool: 여러 개의 스레드를 유지/관리
        threadPoolTaskScheduler.setPoolSize(n);
        threadPoolTaskScheduler.initialize();

        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}