PHpullh
학습 라이브러리/Java/Virtual Threads (Java 21 — Project Loom)

JAVA · 비동기/동시성

Virtual Threads (Java 21 — Project Loom)

수백만 개의 경량 스레드를 생성할 수 있는 Virtual Threads로 동시성 코드를 단순화합니다.

비동기/동시성고급Virtual ThreadProject LoomJava 21VirtualThreadPerTaskExecutorStructuredTaskScope

핵심 설명

수백만 개의 경량 스레드를 생성할 수 있는 Virtual Threads로 동시성 코드를 단순화합니다.

Java code

import java.util.concurrent.*;
import java.time.Duration;

public class VirtualThreads {

    public static void main(String[] args) throws Exception {
        // 기존 Platform Thread
        Thread platform = new Thread(() ->
            System.out.println("플랫폼 스레드: " + Thread.currentThread()));
        platform.start();
        platform.join();

        // Virtual Thread (Java 21+) — 간단 생성
        Thread virtual = Thread.ofVirtual()
            .name("my-virtual")
            .start(() ->
                System.out.println("가상 스레드: " + Thread.currentThread()));
        virtual.join();

        // 수백만 개 가상 스레드
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            var futures = new java.util.ArrayList<Future<String>>();

            for (int i = 0; i < 100_000; i++) {
                final int id = i;
                futures.add(executor.submit(() -> {
                    Thread.sleep(Duration.ofMillis(10));  // I/O 시뮬레이션
                    return "task-" + id;
                }));
            }

            long done = futures.stream()
                .filter(f -> { try { f.get(); return true; } catch (Exception e) { return false; } })
                .count();
            System.out.println("완료: " + done + "개");
        }

        // StructuredTaskScope (Java 21 Preview)
        // try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        //     var user = scope.fork(() -> fetchUser(1));
        //     var orders = scope.fork(() -> fetchOrders("user1"));
        //     scope.join().throwIfFailed();
        //     process(user.get(), orders.get());
        // }

        System.out.println("Virtual Thread는 플랫폼 스레드인가? " +
            Thread.currentThread().isVirtual());
    }
}

학습 팁

Virtual Thread는 I/O 바운드 작업에 최적입니다. CPU 바운드 작업은 여전히 플랫폼 스레드가 적합합니다. synchronized 블록에서 블로킹 I/O를 사용하면 Virtual Thread의 이점이 줄어듭니다.

주의할 점

Virtual Thread에서 ThreadLocal을 남용하면 메모리 문제가 생깁니다. 수백만 스레드 × ThreadLocal 데이터 = 메모리 폭발. ScopedValue(Java 21+)를 고려하세요.

자주 묻는 질문

Virtual Threads (Java 21 — Project Loom)란 무엇인가요?

수백만 개의 경량 스레드를 생성할 수 있는 Virtual Threads로 동시성 코드를 단순화합니다.

Virtual Threads (Java 21 — Project Loom) 학습 시 주의할 점은 무엇인가요?

Virtual Thread에서 ThreadLocal 을 남용하면 메모리 문제가 생깁니다. 수백만 스레드 × ThreadLocal 데이터 = 메모리 폭발. ScopedValue (Java 21+)를 고려하세요.