try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
var r1 = scope.fork(() => task1());
var r2 = scope.fork(() => task2());
scope.join();
scope.throwIfFailed();
}
실무에서 테스트할 수 있는 수준이 됨
1 스레드 = 1 작업 모델을 기본으로 채택 가능커널 수준의 Context Switching 비용
커널이 동시성 제한
왜 Virtual Thread는 훨씬 빠르고 가벼운가?
스택을 필요할 때만 사용하며, 크기도 매우 작고 가변적
컨텍스트 스위치가 JVM 내부에서 이루어짐
시스템 콜을 거의 발생시키지 않음
스케줄링 방식 자체가 경량
Platform Thread
java.lang.ThreadVirtual Thread
Virtual Thread = 작업단위 / 사용자 코드 스택을 잡고 있다가
park()같은 지점에서 떨어져 나왔다가 = unmount예를 들어, Virtual Thread에서 JDBC 호출 같은 블로킹 I/O를 호출하면, JVM은 해당 Virtual Thread의 스택과 상태를 저장해두고 Platform Thread를 다른 작업에 재사용합니다.
I/O가 완료되면 Virtual Thread는 다시 어떤 Platform Thread 위에서 재개됩니다.
이렇게 해서 OS 스레드 수를 최소화하면서도 수많은 동시 요청을 처리할 수 있는 구조가 됩니다.
Java 8
Java 11 – 일부 NIO 기반 내부 변경
Java 14
Java 21
내부적으로 NIO 채널 구현을 일부 재사용하는 수준