StructuredTaskScope And ScopedValue - Get The Most Out of Virtual Threads by Christian Woerz
- Java 21+의 가상 스레드는 JVM 내에서만 존재하며, OS 스레드를 직접 생성하지 않아 적은 워커 스레드로 수백만 개의 가상 스레드를 효율적으로 처리하여 높은 동시성을 제공합니다. 🚀
- 가상 스레드는 블로킹 I/O 시 워커 스레드에서 연결을 끊고 다른 가상 스레드가 워커 스레드를 사용하게 하여, 기존 스레드 풀 방식보다 일관된 응답 시간과 뛰어난 성능을 보여줍니다. ⚡
- 가상 스레드만으로는 여러 블로킹 호출의 순차적 실행으로 인한 지연이나 개별 호출의 예외 처리 문제를 해결하기 어렵습니다. 🚧
- 구조화된 태스크 스코프(STS)는 기존 블로킹 코드를 비동기/논블로킹 방식으로 전면 재작성할 필요 없이, 가상 스레드와 함께 동시성을 활용하는 대안을 제시합니다. 🔄
try (var scope = StructuredTaskScope.open()) 구문을 통해 여러 작업을 가상 스레드에서 동시에 실행하고, scope.join()으로 모든 작업 완료를 기다리는 구조화된 동시성 모델을 제공합니다. 🏗️
scope.fork()는 Subtask를 반환하며, 이는 Success, Failed, Unavailable 상태를 가질 수 있어 개별 작업의 성공 여부를 추적하고 처리할 수 있습니다. ✅
- Java 25에서는
StructuredTaskScope API에 큰 변화가 있었으며, 특히 Joiner를 통해 서브태스크의 결과 처리 방식(예: 모든 태스크 완료 대기 또는 사용자 정의 로직)을 유연하게 구성할 수 있습니다. ⚙️
Joiner를 활용하면 서브태스크 중 하나가 실패하더라도 전체 스코프가 즉시 실패하지 않고, 모든 결과를 수집하여 성공한 결과만 처리하거나 특정 예외를 무시하는 등 정교한 예외 및 결과 처리가 가능합니다. 🤝
- STS를 사용하면 여러 독립적인 블로킹 작업을 병렬로 실행하여 애플리케이션의 전체 응답 시간을 크게 단축시키고, 복잡한 비동기 프로그래밍 모델 없이도 성능을 최적화할 수 있습니다. ⏱️