LostCatBox

Virtual Thread VS CompletableFuture

Word count: 334Reading time: 2 min
2024/04/21 Share

왜?

  • 면접 질문에서 Vertual Thread 에 대한 질문을 받음. 답변하지 못함.
  • CompletableFuture는 기존 사용하던 비동기 API 였다.
  • 둘을 비교해보고 특성을 정리해본다

참조

기존 CompletableFuture

  • 특징

    • 비동기 작업 — 결과를 기다리는 동안 메인 스레드를 차단하지 않습니다.

    • 콜백 — future가 완료될 때 실행할 콜백을 등록할 수 있습니다.

    • 연결 — 미래는 파이프라인 비동기 단계에 함께 연결될 수 있습니다.

    • 예외 처리 — 예외는 콜백을 통해 명시적으로 처리됩니다.

    • 스레드 풀링 — 기본적으로 ForkJoinPool 공통 스레드 풀에서 계산을 실행합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Run two async tasks
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
// long running task
return "Result1";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
// long running task
return "Result2";
});

// Join tasks and handle results
future1.thenCombine(future2, (res1, res2) -> {
return res1 + " " + res2;
}).thenAccept(System.out::println);

Vertual Thread

스크린샷 2024-04-21 오후 3.20.12

  • 특징
    • 경량 — OS 스레드에 비해 메모리 및 리소스 오버헤드가 낮습니다.
    • 관리형 차단 — 차단 작업은 OS 스레드를 차단하지 않고 다른 작업을 위해 해제합니다.
    • 구조화된 동시성 - 가상 스레드는 상위 스레드로부터 컨텍스트를 상속받습니다.
    • 비동기식 — 콜백 기반 코드가 필요하지 않습니다. 동기 코드 스타일을 사용할 수 있습니다.
    • 최적화된 확장 — 수천 개의 가상 스레드를 효율적으로 시작할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {

public static void main(String[] args) {

VirtualThread vt = VirtualMachine.getInstance().virtualThread(
() -> {
// long running task
}
);

vt.start();
// can continue executing main thread logic

}

}

장단점 비교

  • 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
CATALOG
  1. 1. 왜?
  2. 2. 참조
  3. 3. 기존 CompletableFuture
  4. 4. Vertual Thread
  5. 5. 장단점 비교