Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: Forkjoinpool | Monisäikeisyyden Parhaat Käytännöt
Monisäikeisyys Javassa

bookHaaste: 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.

Note
Huomio

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.33

bookHaaste: 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.

Note
Huomio

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3
some-alt