Java Academy · leksjon

Avslutning ved feil og suksess

Samordne resultatene av oppgaver

Leksjon 3 av 413 trinn

Avslutning ved feil og suksess er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

To vanlige mønstre

De fleste former for samtidig fordeling av arbeid følger ett av to mønstre:

  • Alle må lykkes: Hvis én mislykkes, avbrytes resten. Bruk ShutdownOnFailure.
  • Første vinner: Så snart én lykkes, kanselleres resten. Bruk ShutdownOnSuccess.

JDK tilbyr begge ferdig.

Ideen bak ShutdownOnFailure

ShutdownOnFailure brukes for oppgaver som alle må lykkes, for eksempel når De skal hente en brukerprofil og brukerens bestillinger samlet.

Hvis en deloppgave kaster et unntak, kansellerer scopet de andre, slik at De ikke bruker ressurser unødvendig.

Eksempel på ShutdownOnFailure

Etter join() kaller De throwIfFailed(), som kaster den første feilen på nytt (hvis det oppsto en feil), pakket inn i et 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";
    }
}

Hva throwIfFailed gjør

throwIfFailed() undersøker deloppgavene. Hvis alle lyktes, gjør metoden ingenting. Hvis en av dem mislyktes, kaster den et unntak og pakker inn det opprinnelige unntaket.

De kan også sende inn en funksjon som mapper årsaken til en egendefinert unntakstype.

Ideen bak ShutdownOnSuccess

ShutdownOnSuccess brukes ved redundans eller kappløp: spør flere speil og bruk det som svarer først.

I det øyeblikket én deloppgave lykkes, kansellerer scopet resten og lagrer det vinnende resultatet.

Eksempel på ShutdownOnSuccess

De henter den vinnende verdien med result(). Metoden kaster et unntak hvis ingen deloppgave lyktes.

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 kontra get

Legg merke til forskjellen:

  • ShutdownOnFailure: les hver deloppgave med dens egen get()
  • ShutdownOnSuccess: les den eneste vinneren med scopets result()

Kansellering skjer samarbeidsbasert

Når et scope avsluttes, avbryter det de gjenværende deloppgavetrådene. Veloppdragne oppgaver kontrollerer om de er avbrutt, og stopper raskt.

Blokkerende kall i standardbiblioteket reagerer vanligvis automatisk på avbrudd.

join med tidsavbrudd

Begge policyene støtter en tidsfrist. Kallet joinUntil(Instant) venter bare frem til et bestemt tidspunkt, kaster deretter TimeoutException og avslutter scopet.

Velge riktig policy

Still Dem ett spørsmål: Trenger jeg alle resultatene, eller bare det første?

  • Alle resultater, og avslutt raskt ved feil: ShutdownOnFailure
  • Ethvert resultat, der det raskeste vinner: ShutdownOnSuccess

For alt annet kan De lage en underklasse av StructuredTaskScope.

Egendefinerte policyer

De kan utvide StructuredTaskScope og overstyre handleComplete(Subtask) for å implementere egne regler, for eksempel å samle inn de første N vellykkede resultatene eller avslutte etter et bestemt antall feil.

Rask sjekk

Koble scenarioet til riktig policy.

Oppsummering

De har lært de to innebygde avslutningspolicyene:

  • ShutdownOnFailure + throwIfFailed + get for hver deloppgave når alle må lykkes
  • ShutdownOnSuccess + result når den første vinner
  • Avslutning avbryter de gjenværende deloppgavene på en samarbeidsbasert måte
  • joinUntil legger til tidsfrister, mens underklassing legger til egendefinerte regler

Neste: feilhåndtering og kansellering i detalj.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Avslutning ved feil og suksess» gratis?

Ja – hele teksten i «Avslutning ved feil og suksess» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Avslutning ved feil og suksess»?

Samordne resultatene av oppgaver Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Avslutning ved feil og suksess»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Modellen for strukturert samtidighet
  2. StructuredTaskScope
  3. Avslutning ved feil og suksess
  4. Feilhåndtering og kansellering
← Tilbake til Java Academy