Analizamos el arranque y la composición de cálculos asíncronos con
CompletableFuture: cómo iniciar tareas mediante
supplyAsync y
runAsync, en qué se diferencian los manejadores
thenApply,
thenAccept,
thenRun, y cuándo elegir sus variantes asíncronas
thenApplyAsync/
thenAcceptAsync/
thenRunAsync. Hablaremos de los hilos de ejecución (
ForkJoinPool o tu
Executor), de los tipos de resultados (
CompletableFuture<T>,
CompletableFuture<Void>) y de errores típicos: llamadas bloqueantes
get()/
join(), errores no gestionados sin
exceptionally/
handle/
whenComplete, así como el intento de usar el resultado dentro de
thenRun.