Java Virtual Thread

과녁스·2024년 10월 28일
0

Java

목록 보기
11/11
post-thumbnail

개요

Java의 가상 스레드(Virtual Thread) 는 Java 19에서 소개된 "Project Loom"의 일환으로, 경량 스레드의 개념을 도입해 기존의 플랫폼 스레드보다 더 가볍고 효율적으로 동시성을 처리할 수 있도록 한 기능입니다. 이는 스레드 생성 및 관리 비용을 크게 줄이며, 특히 많은 수의 동시 작업을 처리하는 네트워크나 I/O 작업에 적합합니다. Java의 기존 스레드 모델과 가상 스레드의 차이점 및 특성에 대해 간략히 설명하겠습니다.

개념


기존의 자바 플랫폼 스레드는 운영체제(OS)의 스레드와 1:1로 매핑되므로, 많은 스레드를 생성할 경우 OS의 자원 제한으로 인해 성능이 저하될 수 있습니다.


반면 가상 스레드는 자바 애플리케이션 레벨에서 관리되며, OS 스레드와 매핑되지 않아 더 많은 스레드를 효율적으로 생성하고 관리할 수 있습니다.

가상 스레드는 진짜 Java Thread 클래스의 인스턴스이지만, OS 스레드가 아니라 자바의 런타임 환경에서 직접 관리됩니다. 이는 Java의 JVM이 스레드를 경량화하여 관리하고, OS의 자원에 덜 의존하도록 하기 위함입니다.

가상 스레드와 플랫폼 스레드의 차이점

  • 플랫폼 스레드: OS 스레드와 1:1로 매핑되어, 스레드가 OS의 스케줄러에 의해 관리됩니다. 이는 전통적인 방식으로, 많은 수의 스레드 생성을 지원하지 않으며 OS 자원에 의존해 컨텍스트 스위칭 비용이 높습니다.
  • 가상 스레드: 자바 레벨에서 경량 스레드로 관리되며, JVM이 자체적으로 스케줄링합니다. 더 많은 수의 스레드를 생성할 수 있고, 특히 비동기 I/O 작업에 적합하여 많은 작업을 동시에 처리할 때 유리합니다.

가상 스레드의 장점

  • 확장성: 가상 스레드는 수천 개 이상의 스레드 생성도 가능하여, 고도의 동시성을 요구하는 애플리케이션에서도 확장성을 유지할 수 있습니다.
  • 낮은 리소스 사용: OS 스레드와 달리 메모리 및 스케줄링 비용이 낮으며, JVM 내부에서 효율적으로 관리됩니다.
  • 코드 간결성: 기존에 비동기 프로그래밍 모델을 사용해야 했던 많은 네트워크, 파일 I/O 작업을 가상 스레드로 간결하게 작성할 수 있어 가독성이 좋아집니다.

사용 예시

가상 스레드를 활용하는 예는 아래와 같이 간단하게 사용할 수 있습니다. 이를 통해 네트워크 요청과 같은 I/O 지연 작업을 효율적으로 수행할 수 있습니다:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    List<Future<String>> futures = IntStream.range(0, 10)
        .mapToObj(i -> executor.submit(() -> {
            Thread.sleep(1000); // Simulate blocking operation
            return "Task " + i + " completed";
        }))
        .toList();
    
    for (Future<String> future : futures) {
        System.out.println(future.get());
    }
}

주의 사항

가상 스레드는 경량 스레드이지만, 무조건 기존 스레드를 대체할 수 있는 것은 아닙니다. 예를 들어 CPU 집중 작업이 많은 경우, 일반적인 플랫폼 스레드가 더 유리할 수 있습니다. 또한, 가상 스레드가 아직 실험적인 기능이므로 성능 최적화와 안정성 확보에 있어서 추가 검토가 필요합니다.

출처

Java의 미래, Virtual Thread(우아한 기술블로그)

profile
ㅎㅅㅎ

0개의 댓글