왜?
- 면접 질문에서 Vertual Thread 에 대한 질문을 받음. 답변하지 못함.
- CompletableFuture는 기존 사용하던 비동기 API 였다.
- 둘을 비교해보고 특성을 정리해본다
참조
기존 CompletableFuture
특징
비동기 작업 — 결과를 기다리는 동안 메인 스레드를 차단하지 않습니다.
콜백 — future가 완료될 때 실행할 콜백을 등록할 수 있습니다.
연결 — 미래는 파이프라인 비동기 단계에 함께 연결될 수 있습니다.
예외 처리 — 예외는 콜백을 통해 명시적으로 처리됩니다.
스레드 풀링 — 기본적으로 ForkJoinPool 공통 스레드 풀에서 계산을 실행합니다.
1 | // Run two async tasks |
Vertual Thread
- 특징
- 경량 — OS 스레드에 비해 메모리 및 리소스 오버헤드가 낮습니다.
- 관리형 차단 — 차단 작업은 OS 스레드를 차단하지 않고 다른 작업을 위해 해제합니다.
- 구조화된 동시성 - 가상 스레드는 상위 스레드로부터 컨텍스트를 상속받습니다.
- 비동기식 — 콜백 기반 코드가 필요하지 않습니다. 동기 코드 스타일을 사용할 수 있습니다.
- 최적화된 확장 — 수천 개의 가상 스레드를 효율적으로 시작할 수 있습니다.
1 | public class Main { |
장단점 비교
- Style : Virtual Thread 는 콜백함수가 따로 필요없다
- Blocking : Virtual Thread는 I/O 작업과 같은 thread 가 non-runnable 상태에 들어갈 경우, 해당 일을 맡은 OS Thread가 블록킹 되지않는다.(CompletableFuture같은 경우 블로킹됨)
- Overhead : Virtual Thread는 적은 자원 사용 (CompletableFuture는 ThreadPool사용하므로 비교적 비용 높음)
- Structured Concurrency : Virtual Thread 는 부모에게 잡 상속가능
- Chaining : CompletableFuture는 보다 직관적으로 job들을 관리가능
- Error Handling : Unhandled Exception 발생시 Virtual Thread는 쓰레드 종료 시킴. (CompletableFuture는 콜백을 통한 핸들링 요구)
참고사항 (OS Threads VS java Threads)
OS Threads
- User-level Thread & kernel-level Thread
- 관리 주체 : OS
JAVA Threads
- User threads & Daemon threads. (User)
- 관리 주체: JVM