0Pricing
Java Academy · Leçon

Arrêt en cas d’échec ou de réussite

Coordonnez les résultats des tâches

Arrêt en cas d’échec ou de réussite est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Deux schémas courants

La plupart des répartitions concurrentes suivent deux schémas :

  • Toutes doivent réussir : si l'une échoue, abandonner les autres. Utilisez ShutdownOnFailure.
  • La première l'emporte : dès que l'une réussit, annuler les autres. Utilisez ShutdownOnSuccess.

Le JDK fournit ces deux stratégies prêtes à l'emploi.

Principe de ShutdownOnFailure

ShutdownOnFailure convient aux tâches qui doivent toutes réussir, par exemple pour récupérer ensemble un profil utilisateur et ses commandes.

Si une sous-tâche lève une exception, le scope annule les autres afin de ne pas gaspiller de ressources.

Exemple de ShutdownOnFailure

Après join(), vous appelez throwIfFailed(), qui relance le premier échec éventuel, encapsulé dans une 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";
    }
}

Fonctionnement de throwIfFailed

throwIfFailed() examine les sous-tâches. Si elles ont toutes réussi, la méthode ne fait rien. Si l'une d'elles a échoué, elle lève une exception en encapsulant l'exception d'origine.

Vous pouvez également lui transmettre une fonction pour transformer la cause en un type d'exception personnalisé.

Principe de ShutdownOnSuccess

ShutdownOnSuccess convient à la redondance ou à la mise en concurrence : interrogez plusieurs répliques et utilisez celle qui répond la première.

Dès qu'une sous-tâche réussit, le scope annule les autres et mémorise le résultat gagnant.

Exemple de ShutdownOnSuccess

Vous récupérez la valeur gagnante avec result(). Cette méthode lève une exception si aucune sous-tâche n'a réussi.

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";
    }
}

résultat et get

Notez la différence :

  • ShutdownOnFailure : lire chaque sous-tâche avec son propre get()
  • ShutdownOnSuccess : lire l'unique gagnante avec le result() du scope

L'annulation est coopérative

Lorsqu'un scope s'arrête, il interrompt les fils d'exécution des sous-tâches restantes. Les tâches correctement conçues vérifient l'interruption et s'arrêtent rapidement.

Les appels bloquants de la bibliothèque standard réagissent généralement automatiquement à l'interruption.

join avec délai d'attente

Les deux stratégies prennent en charge une échéance. L'appel joinUntil(Instant) attend seulement jusqu'à un instant donné, puis lève TimeoutException et arrête le scope.

Choisir la stratégie

Posez-vous une seule question : ai-je besoin de tous les résultats ou seulement du premier ?

  • Tous les résultats, avec échec immédiat en cas d'erreur : ShutdownOnFailure
  • N'importe quel résultat, le plus rapide l'emporte : ShutdownOnSuccess

Pour tout autre besoin, créez une sous-classe de StructuredTaskScope.

Stratégies personnalisées

Vous pouvez étendre StructuredTaskScope et redéfinir handleComplete(Subtask) pour appliquer des règles particulières, comme recueillir les N premières réussites ou arrêter le scope après un certain nombre d'échecs.

Vérification rapide

Associez chaque scénario à la stratégie correspondante.

Récapitulatif

Vous avez appris les deux stratégies d'arrêt intégrées :

  • ShutdownOnFailure + throwIfFailed + get pour chaque sous-tâche lorsque toutes doivent réussir
  • ShutdownOnSuccess + result lorsque la première réussite l'emporte
  • L'arrêt interrompt les sous-tâches restantes de manière coopérative
  • joinUntil ajoute des échéances ; la création de sous-classes permet d'ajouter des règles personnalisées

Ensuite : la gestion des erreurs et l'annulation en détail.

Questions Fréquemment Posées

La leçon « Arrêt en cas d’échec ou de réussite » est-elle gratuite ?

Oui — le texte complet de « Arrêt en cas d’échec ou de réussite » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Arrêt en cas d’échec ou de réussite » ?

Coordonnez les résultats des tâches Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Arrêt en cas d’échec ou de réussite » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèle de concurrence structurée
  2. StructuredTaskScope
  3. Arrêt en cas d’échec ou de réussite
  4. Gestion des erreurs et annulation
← Retour à Java Academy