Virtual Thread는 Java 19부터 도입되고 Java 21에서 정식으로 안정화된 Project Loom의 핵심 기능 중 하나로, 기존의 Java 플랫폼에서 사용되던 platform thread(또는 OS thread)와는 다른 개념입니다. Virtual thread는 **경량 스레드(lightweight thread)**로서, 수십만 개의 스레드를 동시에 실행할 수 있도록 설계되었습니다.
1. Virtual Thread의 핵심 개념
기존 Platform Thread vs Virtual Thread
| 항목 | Platform Thread | Virtual Thread |
|---|---|---|
| 구현 | OS 레벨에서 관리 | JVM에서 직접 관리 |
| 생성 비용 | 무겁고 리소스 많이 사용 | 가볍고 거의 무제한 생성 가능 |
| 컨텍스트 스위칭 | OS 스케줄러에 의존 | JVM 스케줄러 사용 (빠름) |
| 동시성 처리 | 제한적인 동시성 | 고밀도 동시성 처리 가능 |
2. 주요 특징
경량 스레드
- Virtual thread는 메모리 사용량이 훨씬 적고 생성 속도도 빠릅니다.
- 1:1 매핑이 아닌 M:N 구조로, 여러 virtual thread가 하나의 OS thread를 공유합니다.
차단 I/O와의 통합
- 기존에는
Thread.sleep()이나InputStream.read()같은 blocking I/O 호출이 OS thread를 점유하여 비효율적이었음. - Virtual thread에서는 이러한 호출이 발생하면 JVM이 해당 virtual thread를 parking하고, 다른 작업을 실행시켜 병목을 피함.
코드 스타일 유지
- 기존의
CompletableFuture,ReactiveAPI 없이도 전통적인 동기 코드 스타일을 유지하면서도 고성능 비동기 처리가 가능.
3. 사용 예시
Runnable task = () -> {
System.out.println("Hello from " + Thread.currentThread());
};
Thread thread = Thread.ofVirtual().start(task);
혹은 Executors를 통해 수많은 스레드 처리도 가능:
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 1_000_000).forEach(i ->
executor.submit(() -> {
// 처리 로직
}));
}
4. Virtual Thread의 활용 예
- 고성능 웹 서버: 수천~수십만 개의 요청 처리.
- 데이터베이스 클라이언트: 블로킹 JDBC 호출을 병렬 처리.
- 배치 처리 / ETL 파이프라인: 작업을 수평 확장 없이 병렬화.
5. 참고 사항
- Virtual thread는 완전히 새로운 개념은 아니며, Coroutine, Green Thread 등의 과거 개념과 유사.
- 기존 코드와 호환되며, 특별한 API 변경 없이 사용할 수 있음.
- 단, 네이티브 코드와 상호작용하거나 특정 동기화 방식에서는 주의가 필요.