Introduction
00:00:00The importance of effective communication in personal and professional settings is emphasized. Clear messaging fosters understanding, builds relationships, and enhances collaboration. Miscommunication can lead to conflicts or missed opportunities, highlighting the need for active listening and clarity in expression.
What are Completable Futures?
00:00:07CompletableFuture, introduced in Java 8, addresses the limitations of the Future class for asynchronous programming. It enables non-blocking code execution by running tasks on separate threads instead of relying solely on the main application thread. This approach allows simultaneous task processing and enhances program performance.
What are Future Limitations? Why Completable Futures?
00:01:00The Future class faces significant limitations in handling asynchronous tasks. It cannot be manually completed with cached data if a remote service fails, nor does it allow attaching callback functions or notify upon task completion—it only provides a blocking get() method. Futures lack support for chaining multiple tasks into an asynchronous workflow or combining several futures to execute parallel operations followed by another function after all complete. Additionally, there is no built-in exception handling mechanism within the API. These shortcomings are addressed by CompletableFuture, which supports manual completion, chaining workflows, combining futures efficiently, and robust exception management.
Creating a Completable Future
00:02:49A CompletableFuture instance can be created using a no-argument constructor to represent a future result. Clients retrieve the result by calling get(), which blocks until completion, or complete() to manually set the value and notify waiting clients. To avoid blocking threads while awaiting results, getNow() provides a default value without marking the future as completed. For asynchronous code execution, runAsync and supplyAsync methods create instances from Runnable and Supplier functional interfaces.
Acting on a Completable Future
00:03:54CompletableFuture.runAsync is used for running background tasks asynchronously without returning a result, while supplyAsync allows returning results by providing a Supplier lambda expression. The get method blocks until the task completes but isn't ideal for asynchronous systems. Instead, callbacks like thenApply (transforms and chains results), thenAccept (consumes the result without return), and thenRun (executes after completion without accessing prior results) are preferred. To execute these in different threads than the original future's thread, async variants such as thenApplyAsync or thenAcceptAsync can be utilized.
Combining Completable Futures
00:05:55Efficient CompletableFuture Combinations When combining CompletableFutures, using thenCompose is essential for dependent futures to avoid nested results and achieve a flattened future chain. For independent futures that need synchronization after completion, thenCombine ensures both are complete before executing the callback function. If no resulting value needs passing down the chain, use thenAcceptBoth instead.
Handling Multiple Futures in Parallel To execute multiple parallel tasks and process their combined outcomes once all are done, utilize CompletableFuture.allOf with manual result retrieval via join or Stream API due to its lack of automatic aggregation. Conversely, anyOf completes when any given future finishes but struggles with differing return types among futures.
Exception Handling
00:08:11When working with completable futures, understanding error propagation is crucial. If an error occurs during the initial supplyAsync task or any thenApply callback, subsequent callbacks are skipped and the exception is thrown. The exceptionally method allows recovery by logging exceptions and providing default values without further propagating errors down the chain. Alternatively, handle() offers a more versatile approach as it executes regardless of whether an exception occurred; if there's no issue, its result argument holds data while its exception argument remains null.
Thanks for Watching!
00:09:21The video concludes with expressions of gratitude towards the audience for watching. The speaker hopes that the content was helpful, wishes viewers well, and looks forward to connecting again in future videos.