CompletableFuture.get() blocks the object and waits until the Future task is completed and the result is returned. To build an asynchronous system, there should be a callback, automatically called when the Future task has completed. We can attach a callback to CompletableFuture by using the thenApply(), thenAccept(), and thenRun() methods.