Haaste: Forkjoinpool
Tehtävä
Kuvittele, että järjestät suurta hyväntekeväisyystapahtumaa ja sinun täytyy laskea yhteen kaikki saadut lahjoitukset. Sinulla on lista lahjoitussummista ja haluat selvittää kokonaismäärän kaikista lahjoituksista. Tehtävän helpottamiseksi päätät jakaa listan pienempiin osiin ja jakaa nämä osat ystävillesi auttamaan laskennassa. Jokainen ystävä laskee oman osuutensa kokonaissumman ja ilmoittaa tuloksen sinulle. Lopuksi yhdistät kaikki nämä tulokset saadaksesi lopullisen summan.
Sinulla on DonationTask luokka, joka perii RecursiveTask<Long> -luokan. Sinun tulee ylikirjoittaa tämän luokan compute() metodi toteuttaaksesi logiikan lahjoituslistan jakamiseen ja summien laskemiseen.
DonationTask luokassa on vakio kenttä THRESHOLD, jonka arvo on 200. Tämä kynnysarvo määrittää, kuinka monta lahjoitusta yhdessä osassa voi enintään olla. Älä muuta tätä kynnysarvoa.
Esimerkiksi, jos aloitat listalla, jossa on 1 000 lahjoitusta, sinun tulee jakaa se osiin, joissa on enintään 200 lahjoitusta kussakin. Tämän jälkeen laske kokonaissumma yhdistämällä jokaisen osan tulokset.
THRESHOLD- taulukon jakamisen kynnysarvo;long[] listDonations- lähdetaulukko, jossa kaikki lahjoitukset;int start- taulukon alkukohta;int end- taulukon loppukohta.
On myös RunnableTask luokka, jossa ohjelma suoritetaan. Tässä alustetaan lista ja suoritetaan se ForkJoinPool-säikeessä. Kun kaikki on käynnissä, näytetään tulos.
Jos toteutat compute()-metodin oikein, saat kokonaismäärän:
Sum: 500500
Ratkaisuvihjeet
compute() metodissa tulee tarkistaa, onko taulukon (lahjoituslista) koko pienempi kuin nykyinen kynnysarvo, THRESHOLD. Jos se on pienempi, hyvä; käydään yksinkertaisesti läpi kaikki tämän taulukon alkiot (lahjoituslista), lasketaan niiden summa ja palautetaan tulos.
Jos koko on suurempi, täytyy löytää taulukon keskikohta ja käsitellä rekursiivisesti taulukon vasen ja oikea puoli (ikään kuin jakaisimme listan ystävien kesken).
Tätä varten luodaan 2 DonationTask-oliota, annetaan taulukon rajat ja itse taulukko parametreina, ja kutsutaan näille olioille fork() metodia. Lopuksi saadaan summa kutsumalla join() kummallekin tehtävälle, lisätään tulokset yhteen ja palautetaan kokonaissumma.
Se kuulostaa melko monimutkaiselta, mutta todellisuudessa sinun tarvitsee vain ymmärtää ja toteuttaa yllä oleva havainnollistus!
Olen varma, että onnistut! Mutta jos kohtaat vaikeuksia, voit katsoa ratkaisun.
Kun olet varma, että kaikki toimii, suorita varmennustestit polussa /src/test/java/TaskForkJoinTest.java.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 3.33
Haaste: Forkjoinpool
Pyyhkäise näyttääksesi valikon
Tehtävä
Kuvittele, että järjestät suurta hyväntekeväisyystapahtumaa ja sinun täytyy laskea yhteen kaikki saadut lahjoitukset. Sinulla on lista lahjoitussummista ja haluat selvittää kokonaismäärän kaikista lahjoituksista. Tehtävän helpottamiseksi päätät jakaa listan pienempiin osiin ja jakaa nämä osat ystävillesi auttamaan laskennassa. Jokainen ystävä laskee oman osuutensa kokonaissumman ja ilmoittaa tuloksen sinulle. Lopuksi yhdistät kaikki nämä tulokset saadaksesi lopullisen summan.
Sinulla on DonationTask luokka, joka perii RecursiveTask<Long> -luokan. Sinun tulee ylikirjoittaa tämän luokan compute() metodi toteuttaaksesi logiikan lahjoituslistan jakamiseen ja summien laskemiseen.
DonationTask luokassa on vakio kenttä THRESHOLD, jonka arvo on 200. Tämä kynnysarvo määrittää, kuinka monta lahjoitusta yhdessä osassa voi enintään olla. Älä muuta tätä kynnysarvoa.
Esimerkiksi, jos aloitat listalla, jossa on 1 000 lahjoitusta, sinun tulee jakaa se osiin, joissa on enintään 200 lahjoitusta kussakin. Tämän jälkeen laske kokonaissumma yhdistämällä jokaisen osan tulokset.
THRESHOLD- taulukon jakamisen kynnysarvo;long[] listDonations- lähdetaulukko, jossa kaikki lahjoitukset;int start- taulukon alkukohta;int end- taulukon loppukohta.
On myös RunnableTask luokka, jossa ohjelma suoritetaan. Tässä alustetaan lista ja suoritetaan se ForkJoinPool-säikeessä. Kun kaikki on käynnissä, näytetään tulos.
Jos toteutat compute()-metodin oikein, saat kokonaismäärän:
Sum: 500500
Ratkaisuvihjeet
compute() metodissa tulee tarkistaa, onko taulukon (lahjoituslista) koko pienempi kuin nykyinen kynnysarvo, THRESHOLD. Jos se on pienempi, hyvä; käydään yksinkertaisesti läpi kaikki tämän taulukon alkiot (lahjoituslista), lasketaan niiden summa ja palautetaan tulos.
Jos koko on suurempi, täytyy löytää taulukon keskikohta ja käsitellä rekursiivisesti taulukon vasen ja oikea puoli (ikään kuin jakaisimme listan ystävien kesken).
Tätä varten luodaan 2 DonationTask-oliota, annetaan taulukon rajat ja itse taulukko parametreina, ja kutsutaan näille olioille fork() metodia. Lopuksi saadaan summa kutsumalla join() kummallekin tehtävälle, lisätään tulokset yhteen ja palautetaan kokonaissumma.
Se kuulostaa melko monimutkaiselta, mutta todellisuudessa sinun tarvitsee vain ymmärtää ja toteuttaa yllä oleva havainnollistus!
Olen varma, että onnistut! Mutta jos kohtaat vaikeuksia, voit katsoa ratkaisun.
Kun olet varma, että kaikki toimii, suorita varmennustestit polussa /src/test/java/TaskForkJoinTest.java.
Kiitos palautteestasi!