Virtual Thread는 위의 문제를 해결하기 위해 Project Loom의 결과로 탄생
JEP 444에서 밝힌 Virtual Thread의 목표는 아래와 같다.
- Enable server applications written in the simple thread-per-request style to scale with near-optimal hardware utilization.
- Enable existing code that uses the
java.lang.Thread
API to adopt virtual threads with minimal change.- Enable easy troubleshooting, debugging, and profiling of virtual threads with existing JDK tools.
위의 목표를 어떻게 달성하는지 하나씩 알아보자
플랫폼 스레드와 가상 스레드 비교
플랫폼 스레드 | 가상 스레드 | |
---|---|---|
메타 데이터 사이즈 | 약 2kb(OS별 차이 존재) | 200~300 B |
메모리 | 미리 할당된 Stack 사용 | 필요할 때 Heap 사용 |
컨텍스트 스위칭 비용 | 1~10us | ns (OR 1us 미만) |
생성 시간 | ~1ms | ~10us |
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws Exception {
run();
}
public static void run() throws Exception {
// Virtual Thread 방법 1
Thread.startVirtualThread(() -> {
System.out.println("Hello Virtual Thread");
});
// Virtual Thread 방법 2
Runnable runnable = () -> System.out.println("Hi Virtual Thread");
Thread virtualThread1 = Thread.ofVirtual().start(runnable);
// Virtual Thread 이름 지정
Thread.Builder builder = Thread.ofVirtual().name("JVM-Thread");
Thread virtualThread2 = builder.start(runnable);
// 스레드가 Virtual Thread인지 확인하여 출력
System.out.println("Thread is Virtual? " + virtualThread2.isVirtual());
// ExecutorService 사용
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i <3; i++) {
executorService.submit(runnable);
}
}
}
}
java.lang.Thread
의 인스턴스로, 기존 스레드 사용 코드를 조금만 변경해도 사용 가능함synchronized
, parallelStream
, 혹은 네이티브 메서드를 사용하면 가상 스레드가 캐리어 스레드에 고정되는 문제가 있음synchronized
대신 ReentrantLock
을 사용하는 것이 좋음References
https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html#GUID-A0E4C745-6BC3-4DAE-87ED-E4A094D20A38
https://openjdk.org/jeps/444
https://techblog.woowahan.com/15398/
https://mangkyu.tistory.com/309
https://mangkyu.tistory.com/317
https://jaeyeong951.medium.com/virtual-thread-synchronized-x-6b19aaa09af1
https://medium.com/deno-the-complete-reference/springboot-virtual-threads-vs-webflux-performance-comparison-for-jwt-verify-and-mysql-query-ff94cf251c2c
****https://www.youtube.com/watch?v=Q1jZtN8oMnU&ab_channel=우아한테크
https://findstar.pe.kr/2023/07/02/java-virtual-threads-2/
https://velog.io/@vies00/Java-work-stealing-fork-join-xljtjnflly