Sulkeminen virheen ja onnistumisen yhteydessä
Koordinoi tehtävien tuloksia.
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 omallaget()-kutsullaShutdownOnSuccess: lue ainoa voittaja scopinresult()-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äkohtainenget, kun kaikkien on onnistuttavaShutdownOnSuccess+result, kun ensimmäinen onnistunut voittaa- Sammutus keskeyttää jäljellä olevat alitehtävät yhteistyöhön perustuvasti
joinUntillisää määräajat ja aliluokitus mahdollistaa mukautetut säännöt
Seuraavaksi: virheenkäsittely ja peruutus yksityiskohtaisesti.
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
- Rakenteisen rinnakkaisuuden malli
- StructuredTaskScope
- Sulkeminen virheen ja onnistumisen yhteydessä
- Virheenkäsittely ja peruutus