Java Academy · Lezione

Arresto in caso di errore e successo

Coordinare gli esiti delle attività

Lezione 3 di 413 passaggi

Arresto in caso di errore e successo è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Due pattern comuni

La maggior parte delle distribuzioni di lavoro concorrenti segue uno di due schemi:

  • Tutte devono riuscire: se una fallisce, abbandoni le altre. Utilizzi ShutdownOnFailure.
  • Vince la prima: non appena una ha esito positivo, annulli le altre. Utilizzi ShutdownOnSuccess.

Il JDK fornisce entrambe le opzioni direttamente.

L'idea di ShutdownOnFailure

ShutdownOnFailure è pensato per attività che devono riuscire tutte, ad esempio recuperare insieme il profilo di un utente e i suoi ordini.

Se una sottoattività genera un'eccezione, lo scope annulla le altre per evitare di sprecare risorse.

Esempio di ShutdownOnFailure

Dopo join() chiama throwIfFailed(), che rilancia il primo errore, se presente, racchiuso in un'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";
    }
}

Cosa fa throwIfFailed

throwIfFailed() esamina le sottoattività. Se hanno avuto tutte esito positivo, non fa nulla. Se una ha fallito, genera un'eccezione che racchiude quella originale.

Può anche passare una funzione per trasformare la causa in un tipo di eccezione personalizzato.

L'idea di ShutdownOnSuccess

ShutdownOnSuccess è pensato per la ridondanza o per una gara: interroghi diversi mirror e utilizzi la risposta che arriva per prima.

Nel momento in cui una sottoattività ha esito positivo, lo scope annulla le altre e memorizza il risultato vincente.

Esempio di ShutdownOnSuccess

Recupera il valore vincente con result(). Genera un'eccezione se nessuna sottoattività ha mai avuto esito positivo.

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 e get a confronto

Noti la differenza:

  • ShutdownOnFailure: legga ogni sottoattività con il suo get()
  • ShutdownOnSuccess: legga l'unica attività vincente con result() dello scope

L'annullamento è cooperativo

Quando uno scope viene arrestato, interrompe i thread delle sottoattività rimanenti. Le attività ben implementate verificano l'interruzione e terminano rapidamente.

Le chiamate bloccanti della libreria standard generalmente rispondono automaticamente all'interruzione.

join con timeout

Entrambe le politiche supportano una scadenza. La chiamata a joinUntil(Instant) attende solo fino a un determinato momento, poi genera TimeoutException e arresta lo scope.

Scelta della politica

Si ponga una domanda: servono tutti i risultati o soltanto il primo?

  • Tutti i risultati, con arresto immediato in caso di errore: ShutdownOnFailure
  • Un risultato qualsiasi, vince il più veloce: ShutdownOnSuccess

Per qualsiasi altra esigenza, estenda StructuredTaskScope.

Politiche personalizzate

Può estendere StructuredTaskScope e sovrascrivere handleComplete(Subtask) per implementare regole personalizzate, ad esempio raccogliere i primi N risultati positivi o arrestare lo scope dopo un determinato numero di errori.

Verifica rapida

Abbini lo scenario alla politica corretta.

Riepilogo

Ha imparato le due politiche di arresto integrate:

  • ShutdownOnFailure + throwIfFailed + get per ogni sottoattività quando tutte devono riuscire
  • ShutdownOnSuccess + result quando vince la prima
  • L'arresto interrompe cooperativamente le sottoattività rimanenti
  • joinUntil aggiunge scadenze; l'estensione della classe aggiunge regole personalizzate

Prossimo argomento: gestione degli errori e annullamento in dettaglio.

Gratis per iniziare

Impara Java con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
104
Lezioni
374

Domande Frequenti

La lezione «Arresto in caso di errore e successo» è gratuita?

Sì — il testo completo di «Arresto in caso di errore e successo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Arresto in caso di errore e successo»?

Coordinare gli esiti delle attività Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Arresto in caso di errore e successo»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il modello di concorrenza strutturata
  2. StructuredTaskScope
  3. Arresto in caso di errore e successo
  4. Gestione degli errori e annullamento
← Torna a Java Academy