java

[Java21] Virtual Thread 요약

moonsiri 2023. 5. 15. 20:42
728x90
반응형

개요

Java 8 이후 세 번째 LTS버전인 Java 21이 2023년 9월에 릴리즈 예정인데, 이 버전에 Virtual Thread 기능이 추가될 예정입니다. (현재 Java 19에 Preview Features로 들어가 있음)

그래서 Virtual Thread 주제로 포스팅하려고 보니 이미 잘 정리되어 있는 포스팅이 많아서 요약정리만 하겠습니다.

 

요약

  • 높은 처리량을 보장하는 Reactive Programming인 Spring Webflux는 Mono나 FLux와 같은 Publisher 타입으로 값을 래핑 해야 하기 때문에 코드 가독성이 좋지 않고, 고성능을 보장하더라도 유지보수가 어렵고 러닝커브가 존재합니다.
    • 최신 pinpoint 버전에서는 webflux도 지원하지만 이전 버전에서는 pinpoint로 안 잡힘
  • Virtual Thread를 사용하면 Non-blocking에 대한 처리를 JVM 레벨에서 담당하여 virtual thread pool을 사용하지 않습니다.
    • Blocking이 발생하면 내부적으로 스케줄링을 활용하여 platform thread가 대기하게 두지 않고 다른 virtual thread가 작업할 수 있도록 하여 Non-blocking이 누리는 장점을 동일하게 누릴 수 있음
  • 기존의 Thread(Platform Thread)와 Virtual Thread가 공존합니다.
    • Virtual Thread를 사용하더라도 응답속도가 빨라지진 않음 (처리량만 늘어날 듯)

 

 


 

 

비교

플랫폼 스레드(Platform Thread)와 가상 스레드(Virtual Thread)는 각각의 특성과 장단점이 있습니다. 어떤 상황에서 어느 스레드를 사용하는 것이 좋은지 결정하는 것은 애플리케이션의 요구 사항과 실행 환경에 따라 다릅니다. 

 

Platform Thread

  1. 긴 수명 작업
    • 플랫폼 스레드는 오랫동안 실행되는 작업이나 백그라운드에서 계속 실행되어야 하는 작업에 적합합니다.
      • 예) 서버 애플리케이션의 메인 스레드, 백그라운드에서 로그를 수집하는 스레드.
  2. 저수준 시스템 리소스와 상호작용
    • 파일 I/O, 네트워크 소켓, 외부 라이브러리 호출 등과 같이 저수준 시스템 리소스와 직접 상호작용하는 작업에는 플랫폼 스레드가 더 적합합니다.
  3. CPU 바운스 작업
    • 많은 연산을 수행하는 CPU 집약적 작업의 경우, 플랫폼 스레드는 여전히 유효한 선택입니다. 이러한 작업은 스레드 컨텍스트 스위칭이 적고, 긴 실행 시간을 가지며, 고성능을 요구합니다.
public class PlatformThreadsExample {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                // 긴 수명 작업
                System.out.println("Hello from platform thread " + Thread.currentThread().getName());
            }).start();
        }
    }
}

 

Virtual Thread

  1. 높은 동시성 요구
    • 수백만 개의 동시 요청을 처리해야 하는 고성능 서버 애플리케이션에서는 가상 스레드가 더 효율적입니다. 가상 스레드는 경량화되어 있어 많은 수의 동시 작업을 효율적으로 처리할 수 있습니다.
  2. I/O 바운드 작업
    • 네트워크 호출, 데이터베이스 접근, 파일 읽기/쓰기 등과 같이 I/O 작업이 많은 경우, 가상 스레드는 비동기 I/O와 잘 맞아떨어져 높은 동시성을 제공할 수 있습니다.
  3. 짧은 수명 작업
    • 빠르게 시작하고 종료되는 짧은 작업에는 가상 스레드가 적합합니다.
      • 예) HTTP 요청 처리나 일회성 데이터 처리 작업.
  4. 리소스 절약
    • 많은 수의 스레드를 사용하면서도 메모리와 CPU 리소스를 절약하고자 할 때 가상 스레드를 사용합니다.
public class VirtualThreadsExample {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            Thread.startVirtualThread(() -> {
                // 짧은 수명 작업
                System.out.println("Hello from virtual thread " + Thread.currentThread().getName());
            });
        }
    }
}

 

 

[Reference]

https://openjdk.org/jeps/425

https://findstar.pe.kr/2023/04/17/java-virtual-threads-1/

https://www.baeldung.com/java-virtual-thread-vs-thread

https://theboreddev.com/understanding-java-virtual-threads/

https://www.infoworld.com/article/3678148/intro-to-virtual-threads-a-new-approach-to-java-concurrency.html

https://www.infoq.com/articles/java-virtual-threads/

https://blogs.oracle.com/javamagazine/post/java-loom-virtual-threads-platform-threads

728x90
반응형