스레드(thread)란?
스레드(thread)란 프로세스(process) 내에서 실행되는 작은 작업 단위이다.
스레드의 동작에 대해 보기 위해 스프링 부트에서 다음과 같이 2개의 메서드를 작성하고 돌려보았다.
@Scheduled(fixedDelay = 1000)
public void test1() throws InterruptedException {
Thread.sleep(10000); // 10초간 일시정지
System.out.println(Thread.currentThread().getName() + " -> 테스트 1 : " +
LocalDateTime.now());
}
@Scheduled(fixedDelay = 1000)
public void test2() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " -> 테스트 2 : " +
LocalDateTime.now());
}
코드를 보면 test1과 test2 둘 다 fixedDelay로 1000mills, 1초의 delay를 갖는다.
여기서 추가적으로 test1의 경우 Thread.sleep를 넣어, 10초간 일시정지를 하면서 돌게 하였다.
위의 로직을 통해 test1과 test2는 1초에 1번씩 호출되면서, test1은 10초간의 sleep을 갖고 동작하게 되어,
test1 1번 실행 시 test2 10번 실행으로 동작할거라고 생각할 수 있다.
그러나 출력결과는 예상과 달랐는데..
출력 결과를 보면, test1과 test2는 각각 1번씩 번갈아 출력이 되는 것을 볼 수 있다.
출력에 현재 스레드의 이름을 보면 2개의 테스트가 동일한 스레드를 사용하고 있다는 것을
알 수 있다. 따라서 이 원인으로 하나 메서드가 스레드를 점유하고 있을 경우, 다른 하나는 동작할 수
없게 되는 것이다.
우리가 예상한 방식대로 동작하려면, 스레드가 더 필요하다.
이 기능을 지원해주는 것이 바로 Thread Pool이다.
➡️ Thread Pool이란?
▪ 역할 : 여러개의 스레드를 유지 및 관리해주는 역할
▪ 장점 : 설정된 크기를 스레드를 미리 만들어 놓고 사용하여,
기존에 매번 스레드 생성 후 사용이 완료되면 버리는 작업에 비해 자원 낭비를 줄일 수 있다.
▪ 적정 스레드의 크기는?
▪ CPU처리가 많은 경우 ➡️사용 CPU 코어 개수 + 1
▪ I/O 작업이 많은 경우 ➡️ 사용 CPU 코어 개수 * 2
Thread Pool 생성 방법 (in springboot)
SchedulingConfigurer 인터페이스를 구현해서 작성할 수 있다.
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPool = new ThreadPoolTaskScheduler();
int n = Runtime.getRuntime().availableProcessors();
threadPool.setPoolSize(n + 1);
threadPool.initialize();
taskRegistrar.setTaskScheduler(threadPool);
}
}
위의 코드를 작성하고 다시 run해주면,
각 테스트마다 다른 스케쥴러가 사용되어, 우리가 예상한대로 테스트1이 10초 sleep를 갖을 때,
테스트2는 10번 실행되는 것을 볼 수 있다!
이렇게 작업을 실행해줄 일꾼이 여러명 필요할 때, 스레드풀을 사용해볼 수 있다.!
'Programming > Java' 카테고리의 다른 글
[JAVA] - Arrays.stream 사용 예제 (2) | 2024.01.02 |
---|---|
[JAVA] - 화면에서 입력받는 방법 - Scanner (0) | 2023.11.02 |