Q49: How does CompletableFuture enable non-blocking asynchronous pipeline chaining?

CompletableFuture<T> implements Future<T> and CompletionStage<T>. It allows chaining asynchronous tasks without blocking thread execution:

  • supplyAsync(): Executes task asynchronously on ForkJoinPool.commonPool().
  • thenApply(): Transforms result synchronously ($F: A o B$).
  • thenCompose(): Flattens nested futures ($F: A o ext{CompletableFuture}<B>$).
  • thenCombine(): Combines two independent futures in parallel.
  • exceptionally(): Non-blocking error recovery.
CompletableFuture Pipeline
CompletableFuture.supplyAsync(() -> fetchUserData(userId))
    .thenApply(user -> user.getEmail())
    .thenAccept(email -> sendNotification(email))
    .exceptionally(ex -> {
        logger.error("Pipeline error", ex);
        return null;
    });
💡 Executes background fetching, transformation, and processing without blocking main execution threads.
Key Takeaways
  • Enables functional non-blocking reactive pipelines.
  • thenCompose flattens nested futures; thenCombine executes futures in parallel.
Knowledge Check

Which CompletableFuture method is used to flatten a function that returns another CompletableFuture (similar to flatMap)?