JAVA · 비동기/동시성
Structured Concurrency (Java 21 Preview)
Java 21의 구조화된 동시성(Structured Concurrency)은 여러 하위 작업의 수명을 부모 작업에 종속시킵니다. 하나라도 실패하면 나머지를 자동 취소하여 리소스 누수를 방지합니다.
핵심 설명
Java 21의 구조화된 동시성(Structured Concurrency)은 여러 하위 작업의 수명을 부모 작업에 종속시킵니다. 하나라도 실패하면 나머지를 자동 취소하여 리소스 누수를 방지합니다.
Java code
import java.util.concurrent.*;
import jdk.incubator.concurrent.StructuredTaskScope;
// Java 21 Preview — 구조화된 동시성
record UserProfile(String name, int orderCount, double credit) {}
UserProfile fetchProfile(long userId) throws Exception {
// ShutdownOnFailure: 하나라도 실패 시 나머지 자동 취소
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
// 3개의 하위 작업 동시 실행
Subtask<String> nameTask =
scope.fork(() -> fetchUserName(userId));
Subtask<Integer> orderTask =
scope.fork(() -> fetchOrderCount(userId));
Subtask<Double> creditTask =
scope.fork(() -> fetchCredit(userId));
// 모든 작업 완료 대기 (또는 실패 시 즉시 반환)
scope.join()
.throwIfFailed();
// 모든 결과 수집
return new UserProfile(
nameTask.get(),
orderTask.get(),
creditTask.get()
);
}
// try 블록 종료 시 미완료 작업 자동 취소
}
// ShutdownOnSuccess: 가장 빠른 성공 결과만 사용
String fetchFromMirrors(String key) throws Exception {
try (var scope = new StructuredTaskScope.ShutdownOnSuccess<String>()) {
scope.fork(() -> fetchFromMirror1(key));
scope.fork(() -> fetchFromMirror2(key));
scope.fork(() -> fetchFromMirror3(key));
scope.join();
return scope.result(); // 가장 먼저 성공한 결과
}
}학습 팁
Structured Concurrency는 Virtual Thread와 함께 사용하도록 설계되었습니다. --enable-preview --add-modules jdk.incubator.concurrent 플래그가 필요합니다.
주의할 점
fork()된 작업은 반드시 join() 후에 get()해야 합니다. join 전에 get하면 IllegalStateException이 발생합니다. scope를 try-with-resources 밖에서 사용하지 마세요.
자주 묻는 질문
Structured Concurrency (Java 21 Preview)란 무엇인가요?
Java 21의 구조화된 동시성(Structured Concurrency)은 여러 하위 작업의 수명을 부모 작업에 종속시킵니다. 하나라도 실패하면 나머지를 자동 취소하여 리소스 누수를 방지합니다.
Structured Concurrency (Java 21 Preview) 학습 시 주의할 점은 무엇인가요?
fork() 된 작업은 반드시 join() 후에 get() 해야 합니다. join 전에 get하면 IllegalStateException 이 발생합니다. scope를 try-with-resources 밖에서 사용하지 마세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.