본문 바로가기
IT/Java

Virtual Thread 란?

by 성준하이 2024. 10. 30.
반응형

이번 포스팅에서는 Virtual Thread 에 대해서 다뤄볼 것이다.

Thread 에 대한 개념은 아래 참고 포스팅 참고 바란다.

 

우선 위키에서 설명하는 Virtual Thread 란 아래와 같다.

컴퓨터 프로그래밍에서 가상 스레드는 런타임 라이브러리 또는 가상 머신에 의해 관리되고 "실제" 운영 체제 스레드와 유사하게 만들어 실행되는 코드이지만 후자보다 훨씬 적은 리소스를 필요로 하는 스레드입니다.

https://en.wikipedia.org/wiki/Virtual_thread

 

Virtual thread - Wikipedia

From Wikipedia, the free encyclopedia Computational threads scheduled by a run-time library In computer programming, a virtual thread is a thread that is managed by a runtime library or virtual machine (VM) and made to resemble "real" operating system thre

en.wikipedia.org

 

비동기 프로그래밍

 

Java 19에서 Project Loom으로 시작된 가상 스레드(Virtual Threads)는 동시성 프로그래밍의 새로운 장을 열어준다.

비동기, 동시성 프로그래밍 관련해서는 아래 참고 포스팅 참고 바란다.

Java의 기존 스레드 모델을 크게 개선하여 고성능 서버 애플리케이션 개발에 큰 도움이 될 수 있다. 

 

1. Virtual Threads란?

 

기존 Java의 스레드는 OS에 의해 관리되는 플랫폼 스레드로, 생성 시 상당한 리소스를 소비하며, 많은 스레드를 생성할 경우 시스템이 쉽게 부하를 받게 된다. 그러나 Virtual Thread는 JVM 레벨에서 관리되는 가벼운 스레드로, 수천 개의 스레드를 생성해도 성능에 큰 영향을 주지 않고, 동시성 작업을 수행할 때 매우 효율적이며, 일반적인 스레드 풀의 사용을 줄일 수 있다.

 

2. Virtual Threads의 주요 특징
  • 경량성: Virtual Threads는 생성 및 종료 비용이 거의 없으며, 높은 동시성을 요구하는 작업에 적합
  • 자원 절약: OS 스레드에 비해 적은 메모리를 사용하여 많은 작업을 처리할 수 있음
  • 비동기 프로그래밍 간소화: CompletableFuture나 다른 비동기 도구 없이도 쉽게 비동기 프로그래밍을 구현할 수 있음

 

3. Virtual Threads vs. Platform Threads
특징 Virtual Threads Platform Threads
관리 주체 JVM에서 관리 OS에서 관리
리소스 소비 가벼움, 적은 메모리 사용 무거움, 높은 메모리 사용
생성 비용 낮음 높음
비동기 코드 간결하고 직관적 복잡함
사용 용도 수천 개 이상의 동시 작업 제한된 수의 동시 작업

 

4. Virtual Threads 사용법

 

Java 19부터 가상 스레드를 지원하기 시작했으며, Java 21부터는 Virtual Threads가 기본 기능으로 자리잡게 되었다. 사용법은 아래와 같다.

import java.time.Duration;

public class VirtualThreadExample {
    public static void main(String[] args) {
        // 간단한 Virtual Thread 생성
        Thread virtualThread = Thread.ofVirtual().start(() -> {
            System.out.println("Hello from Virtual Thread: " + Thread.currentThread());
            try {
                Thread.sleep(Duration.ofSeconds(2));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        // 메인 스레드 대기
        try {
            virtualThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Main thread ends here.");
    }
}

 

5. Virtual Threads 활용 예제: 서버 애플리케이션에서 비동기 작업 처리

 

가상 스레드는 특히 대량의 요청을 처리해야 하는 서버 애플리케이션에서 유용하다. 예를 들어, 각 클라이언트의 요청마다 가상 스레드를 생성하여 작업을 처리하고, 처리가 끝나면 가상 스레드를 종료하도록 할 수 있다.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class VirtualThreadServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            System.out.println("Server started on port 8080...");

            while (true) {
                Socket clientSocket = serverSocket.accept();
                
                // 각 클라이언트 요청에 대해 Virtual Thread 생성
                Thread.ofVirtual().start(() -> handleClient(clientSocket));
            }
        }
    }

    private static void handleClient(Socket clientSocket) {
        try (clientSocket) {
            System.out.println("Handling client " + clientSocket);
            clientSocket.getOutputStream().write("Hello from server!".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
위 예제에서는 서버가 각 클라이언트의 연결 요청을 받을 때마다 Virtual Thread를 생성하여 클라이언트를 처리한다. 이를 통해 수천 개 이상의 연결을 동시에 처리할 수 있다.

 

6. 언제 Virtual Threads를 사용해야 할까?
  • 높은 동시성을 요구하는 서버 애플리케이션: 특히 많은 클라이언트 요청을 처리해야 하는 웹 서버에서 유용
  • IO 중심 작업: 데이터베이스 쿼리, 네트워크 통신 등 IO 작업이 많은 프로그램에 적합
  • 리소스 절약이 필요한 경우: 메모리나 CPU 사용을 최적화해야 할 때, 기존 스레드보다 효율적으로 동작
7. 결론

 

Virtual Threads는 자바의 동시성 모델에 큰 변화를 가져왔으며, 특히 높은 동시성을 요구하는 애플리케이션에서 매우 유용하다. Java의 기존 동시성 API를 대체하지 않고 보완하는 기능으로 활용할 수 있으며, 실무에서 서버 성능을 극대화하는 데 매우 유리하다.


참고 포스팅

https://thenicesj.tistory.com/492

 

Thread란? (process비교)

먼저 thread 에 알기 전보다 알아야할 것이 있다.그는 바로 프로세스라는것이고 프로세스와 thread 에 차이를 알아본다. 프로세스(process)란?프로세스(process)란 단순히 실행 중인 프로그램(program)이

thenicesj.tistory.com

https://thenicesj.tistory.com/159

 

동기 / 비동기 프로그래밍

자바스크립트를 다뤄본 사람은 비동기 프로그래밍이라고 들어본적이 있을것이다. 사전적 의미를 먼저 보자면 동기적(synchronous) 어떤 일이나 행동을 일으키게 하는 계기가 되는. 또는 그런 것.

thenicesj.tistory.com

 

반응형

댓글