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+)를 고려하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.