Avslutning ved feil og suksess
Samordne resultatene av oppgaver
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 egenget()ShutdownOnSuccess: les den eneste vinneren med scopetsresult()
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+getfor hver deloppgave når alle må lykkesShutdownOnSuccess+resultnår den første vinner- Avslutning avbryter de gjenværende deloppgavene på en samarbeidsbasert måte
joinUntillegger til tidsfrister, mens underklassing legger til egendefinerte regler
Neste: feilhåndtering og kansellering i detalj.
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
- Modellen for strukturert samtidighet
- StructuredTaskScope
- Avslutning ved feil og suksess
- Feilhåndtering og kansellering