0Pricing
Java Academy · Lección

Cierre por fallo y por éxito

Coordine los resultados de las tareas

Cierre por fallo y por éxito es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 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.

Dos patrones habituales

La mayoría de los casos de distribución concurrente del trabajo encajan en dos formas:

  • Todas deben tener éxito: si alguna falla, abandone las demás. Utilice ShutdownOnFailure.
  • Gana la primera: en cuanto una tiene éxito, cancele las demás. Utilice ShutdownOnSuccess.

El JDK proporciona ambas opciones directamente.

La idea de ShutdownOnFailure

ShutdownOnFailure está pensada para tareas que deben completarse todas correctamente, como recopilar un perfil de usuario y sus pedidos.

Si una subtarea lanza una excepción, el ámbito cancela las demás para no desperdiciar trabajo.

Ejemplo de ShutdownOnFailure

Después de join(), llame a throwIfFailed(), que vuelve a lanzar el primer fallo, si existe, encapsulado en una ExecutionException.

import java.util.concurrent.StructuredTaskScope;

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            var a = scope.fork(() -> fetch("profile"));
            var b = scope.fork(() -> fetch("orders"));
            scope.join();
            scope.throwIfFailed();
            System.out.println(a.get() + " + " + b.get());
        }
    }

    static String fetch(String what) {
        return what + "-ok";
    }
}

Qué hace throwIfFailed

throwIfFailed() inspecciona las subtareas. Si todas se completaron correctamente, no hace nada. Si alguna falló, lanza una excepción que encapsula la excepción original.

También puede pasar una función para convertir la causa en un tipo de excepción personalizado.

La idea de ShutdownOnSuccess

ShutdownOnSuccess sirve para la redundancia o la competición: consulte varios espejos y utilice el que responda primero.

En el momento en que una subtarea tiene éxito, el ámbito cancela las demás y guarda el resultado ganador.

Ejemplo de ShutdownOnSuccess

Obtenga el valor ganador mediante result(). Este método lanza una excepción si ninguna subtarea tuvo éxito.

import java.util.concurrent.StructuredTaskScope;

public class Main {
    public static void main(String[] args) throws Exception {
        try (var scope = new StructuredTaskScope.ShutdownOnSuccess<String>()) {
            scope.fork(() -> queryMirror("eu"));
            scope.fork(() -> queryMirror("us"));
            scope.join();
            System.out.println("Fastest answer: " + scope.result());
        }
    }

    static String queryMirror(String region) {
        return region + "-data";
    }
}

result frente a get

Observe la diferencia:

  • ShutdownOnFailure: lea cada subtarea mediante su propio get()
  • ShutdownOnSuccess: lea el único resultado ganador mediante el result() del ámbito

La cancelación es cooperativa

Cuando un ámbito se cierra, interrumpe los hilos de las subtareas restantes. Las tareas bien implementadas comprueban la interrupción y se detienen rápidamente.

Las llamadas bloqueantes de la biblioteca estándar suelen responder automáticamente a la interrupción.

join con tiempo de espera

Ambas políticas admiten un límite de tiempo. La llamada a joinUntil(Instant) espera solo hasta un momento determinado; después lanza una TimeoutException y cierra el ámbito.

Cómo elegir la política

Hágase una pregunta: ¿necesito todos los resultados o solo el primero?

  • Todos los resultados y fallar rápidamente ante un error: ShutdownOnFailure
  • Cualquier resultado y que gane el más rápido: ShutdownOnSuccess

Para cualquier otro caso, cree una subclase de StructuredTaskScope.

Políticas personalizadas

Puede ampliar StructuredTaskScope y sobrescribir handleComplete(Subtask) para implementar reglas específicas, como recopilar los primeros N éxitos o cerrar el ámbito después de alcanzar un límite de fallos.

Comprobación rápida

Relacione cada situación con su política.

Resumen

Ha aprendido las dos políticas de cierre integradas:

  • ShutdownOnFailure + throwIfFailed + get por subtarea cuando todas deben tener éxito
  • ShutdownOnSuccess + result cuando gana la primera
  • El cierre interrumpe de forma cooperativa las subtareas restantes
  • joinUntil añade límites de tiempo; crear subclases permite añadir reglas personalizadas

A continuación: gestión de errores y cancelación en detalle.

Preguntas frecuentes

¿La lección «Cierre por fallo y por éxito» es gratis?

Sí — el texto completo de «Cierre por fallo y por éxito» 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 «Cierre por fallo y por éxito»?

Coordine los resultados de las tareas 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 3 de 4.

¿Cuánto tiempo toma la lección «Cierre por fallo y por éxito»?

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. El modelo de concurrencia estructurada
  2. StructuredTaskScope
  3. Cierre por fallo y por éxito
  4. Gestión de errores y cancelación
← Volver a Java Academy