
이러한 문제점을 해결하기 위해 가상스레드(Virtual Thread)가 등장한다

가상스레드는 JVM레벨에서 관리되는 스레드이며 수백만 개의 가상스레드 생성해도
메모리와 CPU리소스를 적게 소모한다.
먼저 생각해보면 가상스레드를 사용한다면 기존 OS스레드에 의존적이지 않게 되며
JVM 자체 스케줄러를 사용하기 때문에 스위칭 비용이 작아짐.
또한..
가상 스레드는 1대 1 Wrapping 되어 있지 않기 때문에 언제든지 마운트/언마운트로 플랫폼 스레드에 작업을 할당할 수 있음
즉 가상스레드 1번이 대기상태에 돌입하면, 작업 끝날때까지 플랫폼 스레드를 점유하지 않고 가상스레드 2번이 작업을 시작하고, 가상스레드 1번이 대기상태에서 풀려나면 다시 플랫폼 스레드를 마운트하여 사용한다
@Scheduled(cron = "0 0 6 * * *") // 매일 아침 6시 실행 스캐줄
public void updateAllUserPoints() {
List<User> users = getListAllUsers(); // 모든 유저 리스트 가져오기
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (User user : users) {
executor.submit(() -> { // 작업 제출
updateUserPoints(user); // 유저 포인트 업데이트
});
}
}
}
만약 10000명의 유저의 업데이트 작업을 한다면?
(10000/100) * 200ms => 20000ms => 20초
(10000 (200ms * 80%))/100 => 16초
깔끔하네요👍