PHpullh
학습 라이브러리/Java/Structured Concurrency 심화

JAVA · 비동기/동시성

Structured Concurrency 심화

Java 21의 구조적 동시성으로 스레드 수명을 체계적으로 관리합니다.

비동기/동시성고급StructuredConcurrencyJava21TaskScope구조적동시성

핵심 설명

Java 21의 구조적 동시성으로 스레드 수명을 체계적으로 관리합니다.

Java code

// Java 21 Preview: Structured Concurrency
// --enable-preview 필요

import java.util.concurrent.*;

public class StructuredConcurrencyDemo {
    record User(String name) {}
    record Order(String id) {}
    record Response(User user, Order order) {}

    static User fetchUser() throws Exception {
        Thread.sleep(100);
        return new User("홍길동");
    }

    static Order fetchOrder() throws Exception {
        Thread.sleep(150);
        return new Order("ORD-001");
    }

    static Response handle() throws Exception {
        // StructuredTaskScope — 하위 작업을 구조적으로 관리
        // try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        //     Subtask<User> userTask = scope.fork(() -> fetchUser());
        //     Subtask<Order> orderTask = scope.fork(() -> fetchOrder());
        //
        //     scope.join();            // 모든 하위 작업 대기
        //     scope.throwIfFailed();   // 실패 시 예외
        //
        //     return new Response(userTask.get(), orderTask.get());
        // }
        // 하나 실패 시 나머지 자동 취소!

        // 현재 GA에서 사용 가능한 대안
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            Future<User> userFuture = executor.submit(() -> fetchUser());
            Future<Order> orderFuture = executor.submit(() -> fetchOrder());
            return new Response(userFuture.get(), orderFuture.get());
        }
    }

    public static void main(String[] args) throws Exception {
        Response resp = handle();
        System.out.println(resp);
    }
}

학습 팁

구조적 동시성은 스레드 누수를 방지합니다. 부모 스코프가 끝나면 모든 자식 스레드가 자동으로 종료됩니다.

주의할 점

기존의 비구조적 동시성(fire-and-forget)은 스레드 누수와 에러 전파 실패의 원인입니다. 구조적 동시성으로 전환하세요.

자주 묻는 질문

Structured Concurrency 심화란 무엇인가요?

Java 21의 구조적 동시성으로 스레드 수명을 체계적으로 관리합니다.

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

기존의 비구조적 동시성(fire-and-forget)은 스레드 누수와 에러 전파 실패의 원인입니다. 구조적 동시성으로 전환하세요.

Continue Learning

Java 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.