[Java] Java 21: Virtual Thread

kingkang·2025년 1월 19일
3

🤓 Java

목록 보기
3/3
post-thumbnail

안녕..하시렵니까? jdk 21이 출시된 지 어연 1년째...

이번 프로젝트에서 jdk 21을 쓰게 되어 과연 어떤 점이 달라졌는지 알아보고자 합니다.
고고🎢


Virtual Thread 도입 배경

기존 Java의 스레드(Platform Thread)는 OS의 네이티브 스레드와 1:1로 매핑되었습니다.
이는 메모리 사용량이 많고, 특히 I/O 작업이 많은 애플리케이션에서는 비효율적이라고 합니다.
Virtual Thread는 이러한 문제를 해결하기 위해 도입되었습니다💡

Virtual Thread란?

Virtual Thread는 JDK 21에서 정식으로 도입된 경량 스레드입니다.
기존 스레드(Platform Thread)와 달리 OS 스레드와 1:1로 매핑되지 않아 메모리 사용량이 매우 적고(약 1KB), 특히 I/O 작업이 많은 애플리케이션에서 큰 성능 향상을 기대할 수 있습니다.

Virtual Thread의 구조

핵심은 Virtual Thread가 Carrier Thread (Platform Thread)에 마운트되어 실행된다는 점입니다.
만약 blocking 연산이 발생하면, 해당 Virtual Thread는 자동으로 언마운트되고 다른 Virtual Thread가 그 자리를 채워 실행됩니다. 이런 방식으로 적은 수의 Platform Thread로도 많은 동시 작업을 처리할 수 있게 됩니다.

사용법

// Virtual Thread 방법 1
Thread.startVirtualThread(() => {
	System.out.println("Hello Virtual Thread");
});

// Virtual Thread 방법 2
Runnable runnable = () => System.out.println("Hi Virtual Thread");
Thread virtualThread1 = Thread.ofVirtual().start(runnable);

// Virtual Thread 이름 지정
Thread.Builder builder = Thread.ofVirtual().name("JVM-Thread");
Thread virtualThread2 = builder.start(runnable);

// 스레드가 Virtual Thread인지 확인하여 출력
System.out.println("Thread is Virtual? " + virtualThread2.isVirtual());

// ExecutorService 사용
try (final ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
	for (int i = 0; i < 3; i++) {
    	executorService.submit(runnable);
    }
}

Spring Boot 적용법 (3.2 이상)

Spring Boot 3.2부터는 간단하게 Virtual Thread를 적용할 수 있습니다!

# application.yml
spring:
	threads:
    	virtual:
        	enabled: true

적합한 사용처

1. I/O Blocking이 발생하는 경우
- 데이터베이스 조회, API 호출 등 I/O가 많은 작업에 매우 효과적

2. CPU Intensive 작업에는 적합하지 않음
- 복잡한 계산이나 이미지 처리 같은 CPU를 많이 사용하는 작업은 기존 Thread Pool을 사용하는 것이 적합

3. Spring MVC 기반 Web API 제공 시 편리하게 사용 가능
- Thread per Request 모델을 적은 비용으로 구현 가능


[Reference]

JDK 21의 신기능 Virtual Thread 알아보기

profile
꿈을 꾸물꾸물 꾸지 말자!

1개의 댓글

comment-user-thumbnail
2025년 1월 25일

잘보고갑니다 >__<

답글 달기