Concurrency 중급

가상 스레드를 이용한 동시 HTTP 요청

가상 스레드와 HttpClient로 여러 URL을 동시에 가져옵니다.

✕ Java 8
ExecutorService pool =
    Executors.newFixedThreadPool(10);
List<Future<String>> futures =
    urls.stream()
    .map(u -> pool.submit(
        () -> fetchUrl(u)))
    .toList();
// manual shutdown, blocking get()
✓ Java 21+
try (var exec = Executors
    .newVirtualThreadPerTaskExecutor()) {
    var results = urls.stream()
        .map(u -> exec.submit(
            () -> client.send(req(u),
                ofString()).body()))
        .toList().stream()
        .map(Future::join).toList();
}
이 코드에 문제가 있나요? 알려주세요.
♾️

요청당 스레드

풀 크기 조정 없이 URL당 가상 스레드 하나를 사용합니다.

📖

단순한 코드

직관적인 블로킹 코드를 작성합니다.

높은 처리량

최소한의 리소스로 수천 개의 동시 요청을 처리합니다.

이전 방식
스레드 풀 + URLConnection
모던 방식
가상 스레드 + HttpClient
JDK 버전
21
난이도
중급
가상 스레드를 이용한 동시 HTTP 요청
사용 가능

JDK 21 LTS (2023년 9월) 이후 널리 사용 가능

가상 스레드를 통해 HTTP 요청당 스레드를 하나씩 만드는 것이 현실적으로 가능해졌습니다. HttpClient와 결합하면 확장 가능한 간단한 블로킹 코드로 복잡한 비동기 콜백 패턴을 대체할 수 있습니다.

공유 𝕏 🦋 in