0Pricing
Java Academy · Lección

Creación y finalización de CompletableFutures

Use supplyAsync, runAsync y completedFuture, y complete futures manualmente con complete y completeExceptionally.

Creación y finalización de CompletableFutures es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué es CompletableFuture?

CompletableFuture<T> (Java 8 o posterior) representa un cálculo asíncrono que se puede completar, encadenar y combinar explícitamente. Implementa tanto Future como CompletionStage.

supplyAsync: inicio de un cálculo asíncrono

CompletableFuture.supplyAsync() ejecuta un Supplier en el ForkJoinPool común y devuelve un future con el resultado.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // runs on ForkJoinPool.commonPool()
    return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");

runAsync: ejecutar y olvidar

runAsync() ejecuta un Runnable de forma asíncrona y devuelve CompletableFuture<Void>. Úselo cuando no necesite un resultado.

CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
    sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));

Executor personalizado

Pase un Executor personalizado para controlar el pool de hilos utilizado por el cálculo; es esencial en aplicaciones web donde se quiere evitar bloquear el pool común.

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
    () -> userService.findById(42L), pool
);

completedFuture: valor ya completado

CompletableFuture.completedFuture(value) devuelve un future ya completado. Resulta útil para pruebas o cuando se dispone de un valor inmediato que devolver en una canalización asíncrona.

CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediately

Completar manualmente un future

Use complete() para proporcionar el resultado desde fuera del cálculo. Use completeExceptionally() para indicar un error.

CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!");       // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get();   // blocks until completed

get() y join()

Tanto get() como join() bloquean hasta que se completa el future. get() lanza excepciones comprobadas; join() las envuelve en CompletionException, que no es comprobada.

try {
    String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)

getNow() para comprobaciones sin bloqueo

getNow(defaultValue) devuelve el resultado si ya se ha completado, o el valor predeterminado proporcionado si no; no bloquea ni espera.

String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet done

isDone, isCancelled, isCompletedExceptionally

Compruebe el estado de un future sin bloquear. Combine estas comprobaciones en bucles de consulta periódica o en código de supervisión.

if (future.isDone())                    System.out.println("Completed");
if (future.isCancelled())               System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");

cancel() para gestionar tiempos de espera

Llame a cancel(true) para cancelar un cálculo en curso. El future pasa al estado cancelado y cualquier get() bloqueante lanza CancellationException.

CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);

completeOnTimeout (Java 9 o posterior)

completeOnTimeout(value, timeout, unit) completa automáticamente el future con un valor predeterminado si no se ha completado dentro del tiempo de espera; es más limpio que cancelar manualmente.

CompletableFuture<String> result = fetchAsync()
    .completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3s

Comprobación rápida

¿Qué método inicia un cálculo asíncrono en el ForkJoinPool común y devuelve un valor?

Resumen

supplyAsync y runAsync inician trabajo asíncrono. complete y completeExceptionally completan el future manualmente. Use join() para bloquear sin excepciones comprobadas. completeOnTimeout gestiona los tiempos de espera de forma limpia.

Preguntas frecuentes

¿La lección «Creación y finalización de CompletableFutures» es gratis?

Sí — el texto completo de «Creación y finalización de CompletableFutures» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Creación y finalización de CompletableFutures»?

Use supplyAsync, runAsync y completedFuture, y complete futures manualmente con complete y completeExceptionally. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Creación y finalización de CompletableFutures»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Creación y finalización de CompletableFutures
  2. Encadenamiento con thenApply y thenCompose
  3. Combinación de futures: allOf y anyOf
  4. Gestión de errores y canalización HTTP asíncrona
← Volver a Java Academy