PHpullh
학습 라이브러리/Java/Virtual Thread 심화

JAVA · 비동기/동시성

Virtual Thread 심화

Java 21의 가상 스레드로 대규모 동시성을 저렴하게 구현합니다.

비동기/동시성고급VirtualThreadJava21경량스레드동시성

핵심 설명

Java 21의 가상 스레드로 대규모 동시성을 저렴하게 구현합니다.

Java code

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

public class VirtualThreadAdvanced {
    public static void main(String[] args) throws Exception {
        // 가상 스레드 생성
        Thread vt = Thread.ofVirtual()
            .name("virtual-1")
            .start(() -> System.out.println("가상 스레드!"));
        vt.join();

        // 가상 스레드 ExecutorService
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            // 100만 개 동시 작업도 가능!
            int taskCount = 10_000;
            var latch = new CountDownLatch(taskCount);

            Instant start = Instant.now();
            for (int i = 0; i < taskCount; i++) {
                executor.submit(() -> {
                    try {
                        Thread.sleep(Duration.ofSeconds(1));
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    } finally {
                        latch.countDown();
                    }
                });
            }
            latch.await();
            Duration elapsed = Duration.between(start, Instant.now());
            System.out.printf("%d 태스크 완료: %dms%n",
                taskCount, elapsed.toMillis());
            // 플랫폼 스레드: 수십 초, 가상 스레드: ~1초
        }

        // isVirtual() 확인
        System.out.println("메인 가상? " +
            Thread.currentThread().isVirtual()); // false
    }
}

학습 팁

가상 스레드는 I/O 바운드 작업에 최적화됩니다. CPU 집약적 작업에는 플랫폼 스레드 풀이 더 적합합니다.

주의할 점

가상 스레드에서 synchronized 블록은 캐리어 스레드를 고정(pinning)합니다. ReentrantLock으로 대체하세요.

자주 묻는 질문

Virtual Thread 심화란 무엇인가요?

Java 21의 가상 스레드로 대규모 동시성을 저렴하게 구현합니다.

Virtual Thread 심화 학습 시 주의할 점은 무엇인가요?

가상 스레드에서 synchronized 블록은 캐리어 스레드를 고정(pinning)합니다. ReentrantLock 으로 대체하세요.