Start here. This is the direct spoken answer to practice first.
Overview
Future represents one pending result; CompletableFuture also lets dependent work be composed and completed programmatically.
A Future<T> lets code check, wait for, or cancel one submitted task, but get blocks and the interface has little composition support. CompletableFuture<T> implements both Future and CompletionStage, so code can transform, combine, and recover from results through dependent stages. Non-async continuations may run on the thread that completes the prior stage. Async methods without an executor normally use the common pool.