Pink Spider/Virtual Thread

Created Thu, 24 Apr 2025 11:26:42 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
752 Words 3 min

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, Reactive API 없이도 전통적인 동기 코드 스타일을 유지하면서도 고성능 비동기 처리가 가능.

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 변경 없이 사용할 수 있음.
  • 단, 네이티브 코드와 상호작용하거나 특정 동기화 방식에서는 주의가 필요.