0Pricing
Java Academy · 강의

CompletableFutures 생성과 완료

supplyAsync, runAsync, completedFuture를 사용하고 complete와 completeExceptionally로 퓨처를 직접 완료합니다.

CompletableFutures 생성과 완료은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

CompletableFuture란 무엇입니까

CompletableFuture<T>(Java 8 이상)는 명시적으로 완료하고, 연결하고, 결합할 수 있는 비동기 계산을 나타냅니다. Future와 CompletionStage를 모두 구현합니다.

supplyAsync: 비동기 계산 시작

CompletableFuture.supplyAsync()는 공용 ForkJoinPool에서 Supplier를 실행하고 결과를 담은 퓨처를 반환합니다.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // runs on ForkJoinPool.commonPool()
    return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");

runAsync: 실행 후 잊기

runAsync()는 Runnable을 비동기적으로 실행하고 CompletableFuture<Void>를 반환합니다. 결과가 필요하지 않을 때 사용하십시오.

CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
    sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));

사용자 지정 실행기

계산에 사용할 스레드 풀을 제어하려면 사용자 지정 Executor를 전달하십시오. 공용 풀의 블로킹을 피해야 하는 웹 애플리케이션에서 특히 중요합니다.

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
    () -> userService.findById(42L), pool
);

completedFuture: 이미 완료된 값

CompletableFuture.completedFuture(value)는 이미 완료된 퓨처를 반환합니다. 테스트하거나 비동기 처리 흐름에서 즉시 반환할 값이 있을 때 유용합니다.

CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediately

퓨처 수동 완료

계산 외부에서 결과를 제공하려면 complete()를 사용하십시오. 실패를 알리려면 completeExceptionally()를 사용하십시오.

CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!");       // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get();   // blocks until completed

get()과 join()

get()과 join()은 모두 퓨처가 완료될 때까지 블로킹합니다. get()은 검사 예외를 발생시키고, join()은 검사 예외를 검사되지 않은 CompletionException으로 감쌉니다.

try {
    String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)

비블로킹 확인을 위한 getNow()

getNow(defaultValue)는 이미 완료된 경우 결과를 반환하고, 그렇지 않으면 제공된 기본값을 반환합니다. 블로킹이나 대기가 발생하지 않습니다.

String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet done

isDone, isCancelled, isCompletedExceptionally

블로킹하지 않고 퓨처의 상태를 확인하십시오. 폴링 반복문이나 모니터링 코드에서 이러한 확인을 조합하여 사용하십시오.

if (future.isDone())                    System.out.println("Completed");
if (future.isCancelled())               System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");

시간 초과 처리를 위한 cancel()

진행 중인 계산을 취소하려면 cancel(true)를 호출하십시오. 퓨처가 취소된 상태로 전환되고, 블로킹 중인 get()은 CancellationException을 발생시킵니다.

CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);

completeOnTimeout(Java 9 이상)

completeOnTimeout(value, timeout, unit)은 지정된 시간 초과 시간 안에 퓨처가 완료되지 않으면 기본값으로 퓨처를 자동 완료합니다. 수동으로 취소하는 것보다 깔끔합니다.

CompletableFuture<String> result = fetchAsync()
    .completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3s

빠른 확인

공용 ForkJoinPool에서 비동기 계산을 시작하고 값을 반환하는 메서드는 무엇입니까?

복습

supplyAsync와 runAsync는 비동기 작업을 시작합니다. complete와 completeExceptionally는 수동으로 완료합니다. 검사되지 않은 블로킹에는 join()을 사용하십시오. completeOnTimeout은 시간 초과를 깔끔하게 처리합니다.

자주 묻는 질문

“CompletableFutures 생성과 완료” 강의는 무료인가요?

네 — “CompletableFutures 생성과 완료” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“CompletableFutures 생성과 완료”에서 뭘 배우나요?

supplyAsync, runAsync, completedFuture를 사용하고 complete와 completeExceptionally로 퓨처를 직접 완료합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“CompletableFutures 생성과 완료” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CompletableFutures 생성과 완료
  2. thenApply와 thenCompose를 사용한 연결
  3. 퓨처 결합: allOf와 anyOf
  4. 오류 처리와 비동기 HTTP 파이프라인
← Java Academy(으)로 돌아가기