Java Academy · Oppitunti

Sulkeminen virheen ja onnistumisen yhteydessä

Koordinoi tehtävien tuloksia.

Oppitunti 3/413 vaihetta

Sulkeminen virheen ja onnistumisen yhteydessä on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi yleistä mallia

Useimmat samanaikaiset hajautukset noudattavat jompaakumpaa näistä malleista:

  • Kaikkien on onnistuttava: jos jokin epäonnistuu, hylkää loput. Käytä ShutdownOnFailure-käytäntöä.
  • Ensimmäinen voittaa: heti kun yksi onnistuu, peruuta loput. Käytä ShutdownOnSuccess-käytäntöä.

JDK tarjoaa molemmat valmiina.

ShutdownOnFailure-käytännön idea

ShutdownOnFailure sopii tehtäviin, joiden kaikkien on onnistuttava, kuten käyttäjäprofiilin ja hänen tilaustensa hakemiseen yhdessä.

Jos yksi alitehtävä heittää poikkeuksen, scope peruuttaa muut, jotta työpanosta ei tuhlata.

ShutdownOnFailure-esimerkki

join()-kutsun jälkeen kutsut throwIfFailed()-metodia, joka heittää ensimmäisen virheen uudelleen (jos sellainen on) ExecutionException-poikkeukseen käärittynä.

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

Mitä throwIfFailed tekee

throwIfFailed() tarkastelee alitehtäviä. Jos kaikki onnistuivat, se ei tee mitään. Jos jokin epäonnistui, se heittää poikkeuksen ja käärii alkuperäisen poikkeuksen sen sisään.

Voit myös välittää funktion, joka muuntaa syyn mukautetuksi poikkeustyypiksi.

ShutdownOnSuccess-käytännön idea

ShutdownOnSuccess sopii vikasietoisuuteen tai kilpailuttamiseen: kysy useilta peilipalvelimilta ja käytä sitä vastausta, joka saapuu ensimmäisenä.

Heti kun yksi alitehtävä onnistuu, scope peruuttaa loput ja tallentaa voittavan tuloksen.

ShutdownOnSuccess-esimerkki

Voit hakea voittavan arvon kutsulla result(). Se heittää poikkeuksen, jos yksikään alitehtävä ei onnistunut.

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

Huomaa ero:

  • ShutdownOnFailure: lue kukin alitehtävä sen omalla get()-kutsulla
  • ShutdownOnSuccess: lue ainoa voittaja scopin result()-kutsulla

Peruutus perustuu yhteistyöhön

Kun scope sammutetaan, se keskeyttää jäljellä olevien alitehtävien säikeet. Yhteistyökykyiset tehtävät tarkistavat keskeytyksen ja pysähtyvät nopeasti.

Standardikirjaston estävät kutsut reagoivat yleensä keskeytykseen automaattisesti.

join aikakatkaisulla

Molemmat käytännöt tukevat määräaikaa. Kutsu joinUntil(Instant) odottaa vain tiettyyn ajanhetkeen asti, minkä jälkeen se heittää TimeoutException-poikkeuksen ja sammuttaa scopin.

Käytännön valitseminen

Kysy itseltäsi yksi kysymys: tarvitsenko kaikki tulokset vai vain ensimmäisen?

  • Kaikki tulokset, keskeytä heti virheen ilmetessä: ShutdownOnFailure
  • Mikä tahansa yksi tulos, nopein voittaa: ShutdownOnSuccess

Kaikissa muissa tapauksissa peri StructuredTaskScope-luokka.

Mukautetut käytännöt

Voit laajentaa StructuredTaskScope-luokkaa ja korvata handleComplete(Subtask)-metodin omien erityissääntöjen toteuttamiseksi, esimerkiksi kerätäksesi ensimmäiset N onnistumista tai sammuttaaksesi scopin, kun epäonnistumisten kiintiö täyttyy.

Pikatarkistus

Yhdistä skenaario oikeaan käytäntöön.

Kertaus

Opit käyttämään kahta sisäänrakennettua sammutuskäytäntöä:

  • ShutdownOnFailure + throwIfFailed + alitehtäväkohtainen get, kun kaikkien on onnistuttava
  • ShutdownOnSuccess + result, kun ensimmäinen onnistunut voittaa
  • Sammutus keskeyttää jäljellä olevat alitehtävät yhteistyöhön perustuvasti
  • joinUntil lisää määräajat ja aliluokitus mahdollistaa mukautetut säännöt

Seuraavaksi: virheenkäsittely ja peruutus yksityiskohtaisesti.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Sulkeminen virheen ja onnistumisen yhteydessä” ilmainen?

Kyllä – oppitunnin ”Sulkeminen virheen ja onnistumisen yhteydessä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sulkeminen virheen ja onnistumisen yhteydessä”?

Koordinoi tehtävien tuloksia. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Sulkeminen virheen ja onnistumisen yhteydessä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Rakenteisen rinnakkaisuuden malli
  2. StructuredTaskScope
  3. Sulkeminen virheen ja onnistumisen yhteydessä
  4. Virheenkäsittely ja peruutus
← Takaisin: Java Academy