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 propioget()ShutdownOnSuccess: lea el único resultado ganador mediante elresult()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+getpor subtarea cuando todas deben tener éxitoShutdownOnSuccess+resultcuando gana la primera- El cierre interrumpe de forma cooperativa las subtareas restantes
joinUntilañ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
- El modelo de concurrencia estructurada
- StructuredTaskScope
- Cierre por fallo y por éxito
- Gestión de errores y cancelación